Merge remote-tracking branch 'Nightscout/dev' into wear/new_custom_watchface

# Conflicts:
#	wear/src/main/java/info/nightscout/androidaps/watchfaces/CustomWatchface.kt
This commit is contained in:
Philoul 2023-09-20 23:11:54 +02:00
commit 23cb374ab3
886 changed files with 9349 additions and 7425 deletions

View file

@ -21,5 +21,5 @@ android {
} }
dependencies { dependencies {
implementation project(':app-wear-shared:shared') implementation project(':core:interfaces')
} }

View file

@ -4,10 +4,18 @@ import android.content.Context
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
import info.nightscout.rx.AapsSchedulers
import info.nightscout.rx.bus.RxBus
import info.nightscout.rx.interfaces.L import info.nightscout.rx.interfaces.L
import info.nightscout.rx.logging.AAPSLogger
import info.nightscout.shared.impl.logging.AAPSLoggerProduction
import info.nightscout.shared.impl.logging.LImpl import info.nightscout.shared.impl.logging.LImpl
import info.nightscout.shared.impl.rx.AapsSchedulersImpl
import info.nightscout.shared.impl.rx.bus.RxBusImpl
import info.nightscout.shared.impl.sharedPreferences.SPImplementation import info.nightscout.shared.impl.sharedPreferences.SPImplementation
import info.nightscout.shared.sharedPreferences.SP import info.nightscout.shared.sharedPreferences.SP
import info.nightscout.shared.utils.DateUtil
import info.nightscout.shared.utils.DateUtilImpl
import javax.inject.Singleton import javax.inject.Singleton
@Module( @Module(
@ -23,4 +31,20 @@ open class SharedImplModule {
@Provides @Provides
@Singleton @Singleton
fun provideL(sp: SP): L = LImpl(sp) fun provideL(sp: SP): L = LImpl(sp)
@Provides
@Singleton
fun provideDateUtil(context: Context): DateUtil = DateUtilImpl(context)
@Provides
@Singleton
fun provideAAPSLogger(l: L): AAPSLogger = AAPSLoggerProduction(l)
@Provides
@Singleton
fun provideRxBus(aapsSchedulers: AapsSchedulers, aapsLogger: AAPSLogger): RxBus = RxBusImpl(aapsSchedulers, aapsLogger)
@Provides
@Singleton
internal fun provideSchedulers(): AapsSchedulers = AapsSchedulersImpl()
} }

View file

@ -1,6 +1,8 @@
package info.nightscout.rx.logging package info.nightscout.shared.impl.logging
import info.nightscout.rx.interfaces.L import info.nightscout.rx.interfaces.L
import info.nightscout.rx.logging.AAPSLogger
import info.nightscout.rx.logging.LTag
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
/** /**

View file

@ -0,0 +1,16 @@
package info.nightscout.shared.impl.rx
import info.nightscout.rx.AapsSchedulers
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.core.Scheduler
import io.reactivex.rxjava3.schedulers.Schedulers
import javax.inject.Singleton
@Singleton
class AapsSchedulersImpl : AapsSchedulers {
override val main: Scheduler = AndroidSchedulers.mainThread()
override val io: Scheduler = Schedulers.io()
override val cpu: Scheduler = Schedulers.computation()
override val newThread: Scheduler = Schedulers.newThread()
}

View file

@ -1,7 +1,8 @@
package info.nightscout.rx.bus package info.nightscout.shared.impl.rx.bus
import info.nightscout.annotations.OpenForTesting import info.nightscout.annotations.OpenForTesting
import info.nightscout.rx.AapsSchedulers import info.nightscout.rx.AapsSchedulers
import info.nightscout.rx.bus.RxBus
import info.nightscout.rx.events.Event import info.nightscout.rx.events.Event
import info.nightscout.rx.logging.AAPSLogger import info.nightscout.rx.logging.AAPSLogger
import info.nightscout.rx.logging.LTag import info.nightscout.rx.logging.LTag
@ -12,21 +13,21 @@ import javax.inject.Singleton
@OpenForTesting @OpenForTesting
@Singleton @Singleton
class RxBus @Inject constructor( class RxBusImpl @Inject constructor(
val aapsSchedulers: AapsSchedulers, val aapsSchedulers: AapsSchedulers,
val aapsLogger: AAPSLogger val aapsLogger: AAPSLogger
) { ) : RxBus {
private val publisher = PublishSubject.create<Event>() private val publisher = PublishSubject.create<Event>()
fun send(event: Event) { override fun send(event: Event) {
aapsLogger.debug(LTag.EVENTS, "Sending $event") aapsLogger.debug(LTag.EVENTS, "Sending $event")
publisher.onNext(event) publisher.onNext(event)
} }
// Listen should return an Observable and not the publisher // Listen should return an Observable and not the publisher
// Using ofType we filter only events that match that class type // Using ofType we filter only events that match that class type
fun <T : Any> toObservable(eventType: Class<T>): Observable<T> = override fun <T : Any> toObservable(eventType: Class<T>): Observable<T> =
publisher publisher
.subscribeOn(aapsSchedulers.io) .subscribeOn(aapsSchedulers.io)
.ofType(eventType) .ofType(eventType)

View file

@ -5,7 +5,7 @@ import android.os.Build
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import androidx.collection.LongSparseArray import androidx.collection.LongSparseArray
import info.nightscout.annotations.OpenForTesting import info.nightscout.annotations.OpenForTesting
import info.nightscout.shared.R import info.nightscout.interfaces.R
import info.nightscout.shared.SafeParse import info.nightscout.shared.SafeParse
import info.nightscout.shared.interfaces.ResourceHelper import info.nightscout.shared.interfaces.ResourceHelper
import org.apache.commons.lang3.time.DateUtils.isSameDay import org.apache.commons.lang3.time.DateUtils.isSameDay
@ -40,7 +40,7 @@ import kotlin.math.floor
*/ */
@OpenForTesting @OpenForTesting
@Singleton @Singleton
class DateUtil @Inject constructor(private val context: Context) { class DateUtilImpl @Inject constructor(private val context: Context) : DateUtil {
/** /**
* The date format in iso. * The date format in iso.
@ -55,7 +55,7 @@ class DateUtil @Inject constructor(private val context: Context) {
* @param isoDateString the iso date string * @param isoDateString the iso date string
* @return the date * @return the date
*/ */
fun fromISODateString(isoDateString: String): Long { override fun fromISODateString(isoDateString: String): Long {
val parser = ISODateTimeFormat.dateTimeParser() val parser = ISODateTimeFormat.dateTimeParser()
val dateTime = DateTime.parse(isoDateString, parser) val dateTime = DateTime.parse(isoDateString, parser)
return dateTime.toDate().time return dateTime.toDate().time
@ -67,27 +67,27 @@ class DateUtil @Inject constructor(private val context: Context) {
* @param date the date obj * @param date the date obj
* @return the iso-formatted date string * @return the iso-formatted date string
*/ */
fun toISOString(date: Long): String { override fun toISOString(date: Long): String {
val f: DateFormat = SimpleDateFormat(FORMAT_DATE_ISO_OUT, Locale.getDefault()) val f: DateFormat = SimpleDateFormat(FORMAT_DATE_ISO_OUT, Locale.getDefault())
f.timeZone = TimeZone.getTimeZone("UTC") f.timeZone = TimeZone.getTimeZone("UTC")
return f.format(date) return f.format(date)
} }
@Suppress("SpellCheckingInspection") @Suppress("SpellCheckingInspection")
fun toISOAsUTC(timestamp: Long): String { override fun toISOAsUTC(timestamp: Long): String {
val format = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'0000Z'", Locale.US) val format = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'0000Z'", Locale.US)
format.timeZone = TimeZone.getTimeZone("UTC") format.timeZone = TimeZone.getTimeZone("UTC")
return format.format(timestamp) return format.format(timestamp)
} }
@Suppress("SpellCheckingInspection") @Suppress("SpellCheckingInspection")
fun toISONoZone(timestamp: Long): String { override fun toISONoZone(timestamp: Long): String {
val format = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.US) val format = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.US)
format.timeZone = TimeZone.getDefault() format.timeZone = TimeZone.getDefault()
return format.format(timestamp) return format.format(timestamp)
} }
fun secondsOfTheDayToMilliseconds(seconds: Int): Long { override fun secondsOfTheDayToMilliseconds(seconds: Int): Long {
val calendar: Calendar = GregorianCalendar() val calendar: Calendar = GregorianCalendar()
calendar[Calendar.MONTH] = 0 // Set january to be sure we miss DST changing calendar[Calendar.MONTH] = 0 // Set january to be sure we miss DST changing
calendar[Calendar.HOUR_OF_DAY] = seconds / 60 / 60 calendar[Calendar.HOUR_OF_DAY] = seconds / 60 / 60
@ -96,7 +96,7 @@ class DateUtil @Inject constructor(private val context: Context) {
return calendar.timeInMillis return calendar.timeInMillis
} }
fun toSeconds(hhColonMm: String): Int { override fun toSeconds(hhColonMm: String): Int {
val p = Pattern.compile("(\\d+):(\\d+)( a.m.| p.m.| AM| PM|AM|PM|)") val p = Pattern.compile("(\\d+):(\\d+)( a.m.| p.m.| AM| PM|AM|PM|)")
val m = p.matcher(hhColonMm) val m = p.matcher(hhColonMm)
var retVal = 0 var retVal = 0
@ -108,12 +108,12 @@ class DateUtil @Inject constructor(private val context: Context) {
return retVal return retVal
} }
fun dateString(mills: Long): String { override fun dateString(mills: Long): String {
val df = DateFormat.getDateInstance(DateFormat.SHORT) val df = DateFormat.getDateInstance(DateFormat.SHORT)
return df.format(mills) return df.format(mills)
} }
fun dateStringRelative(mills: Long, rh: ResourceHelper): String { override fun dateStringRelative(mills: Long, rh: ResourceHelper): String {
val df = DateFormat.getDateInstance(DateFormat.SHORT) val df = DateFormat.getDateInstance(DateFormat.SHORT)
val day = df.format(mills) val day = df.format(mills)
val beginOfToday = beginOfDay(now()) val beginOfToday = beginOfDay(now())
@ -133,7 +133,7 @@ class DateUtil @Inject constructor(private val context: Context) {
} }
} }
fun dateStringShort(mills: Long): String { override fun dateStringShort(mills: Long): String {
var format = "MM/dd" var format = "MM/dd"
if (android.text.format.DateFormat.is24HourFormat(context)) { if (android.text.format.DateFormat.is24HourFormat(context)) {
format = "dd/MM" format = "dd/MM"
@ -141,8 +141,8 @@ class DateUtil @Inject constructor(private val context: Context) {
return DateTime(mills).toString(DateTimeFormat.forPattern(format)) return DateTime(mills).toString(DateTimeFormat.forPattern(format))
} }
fun timeString(): String = timeString(now()) override fun timeString(): String = timeString(now())
fun timeString(mills: Long): String { override fun timeString(mills: Long): String {
var format = "hh:mma" var format = "hh:mma"
if (android.text.format.DateFormat.is24HourFormat(context)) { if (android.text.format.DateFormat.is24HourFormat(context)) {
format = "HH:mm" format = "HH:mm"
@ -150,16 +150,16 @@ class DateUtil @Inject constructor(private val context: Context) {
return DateTime(mills).toString(DateTimeFormat.forPattern(format)) return DateTime(mills).toString(DateTimeFormat.forPattern(format))
} }
fun secondString(): String = secondString(now()) override fun secondString(): String = secondString(now())
fun secondString(mills: Long): String = override fun secondString(mills: Long): String =
DateTime(mills).toString(DateTimeFormat.forPattern("ss")) DateTime(mills).toString(DateTimeFormat.forPattern("ss"))
fun minuteString(): String = minuteString(now()) override fun minuteString(): String = minuteString(now())
fun minuteString(mills: Long): String = override fun minuteString(mills: Long): String =
DateTime(mills).toString(DateTimeFormat.forPattern("mm")) DateTime(mills).toString(DateTimeFormat.forPattern("mm"))
fun hourString(): String = hourString(now()) override fun hourString(): String = hourString(now())
fun hourString(mills: Long): String { override fun hourString(mills: Long): String {
var format = "hh" var format = "hh"
if (android.text.format.DateFormat.is24HourFormat(context)) { if (android.text.format.DateFormat.is24HourFormat(context)) {
format = "HH" format = "HH"
@ -167,27 +167,27 @@ class DateUtil @Inject constructor(private val context: Context) {
return DateTime(mills).toString(DateTimeFormat.forPattern(format)) return DateTime(mills).toString(DateTimeFormat.forPattern(format))
} }
fun amPm(): String = amPm(now()) override fun amPm(): String = amPm(now())
fun amPm(mills: Long): String = override fun amPm(mills: Long): String =
DateTime(mills).toString(DateTimeFormat.forPattern("a")) DateTime(mills).toString(DateTimeFormat.forPattern("a"))
fun dayNameString(format: String = "E"): String = dayNameString(now(), format) override fun dayNameString(format: String): String = dayNameString(now(), format)
fun dayNameString(mills: Long, format: String = "E"): String = override fun dayNameString(mills: Long, format: String): String =
DateTime(mills).toString(DateTimeFormat.forPattern(format)) DateTime(mills).toString(DateTimeFormat.forPattern(format))
fun dayString(): String = dayString(now()) override fun dayString(): String = dayString(now())
fun dayString(mills: Long): String = override fun dayString(mills: Long): String =
DateTime(mills).toString(DateTimeFormat.forPattern("dd")) DateTime(mills).toString(DateTimeFormat.forPattern("dd"))
fun monthString(format: String = "MMM"): String = monthString(now(), format) override fun monthString(format: String): String = monthString(now(), format)
fun monthString(mills: Long, format: String = "MMM"): String = override fun monthString(mills: Long, format: String): String =
DateTime(mills).toString(DateTimeFormat.forPattern(format)) DateTime(mills).toString(DateTimeFormat.forPattern(format))
fun weekString(): String = weekString(now()) override fun weekString(): String = weekString(now())
fun weekString(mills: Long): String = override fun weekString(mills: Long): String =
DateTime(mills).toString(DateTimeFormat.forPattern("ww")) DateTime(mills).toString(DateTimeFormat.forPattern("ww"))
fun timeStringWithSeconds(mills: Long): String { override fun timeStringWithSeconds(mills: Long): String {
var format = "hh:mm:ssa" var format = "hh:mm:ssa"
if (android.text.format.DateFormat.is24HourFormat(context)) { if (android.text.format.DateFormat.is24HourFormat(context)) {
format = "HH:mm:ss" format = "HH:mm:ss"
@ -195,46 +195,46 @@ class DateUtil @Inject constructor(private val context: Context) {
return DateTime(mills).toString(DateTimeFormat.forPattern(format)) return DateTime(mills).toString(DateTimeFormat.forPattern(format))
} }
fun dateAndTimeRangeString(start: Long, end: Long): String { override fun dateAndTimeRangeString(start: Long, end: Long): String {
return dateAndTimeString(start) + " - " + timeString(end) return dateAndTimeString(start) + " - " + timeString(end)
} }
fun timeRangeString(start: Long, end: Long): String { override fun timeRangeString(start: Long, end: Long): String {
return timeString(start) + " - " + timeString(end) return timeString(start) + " - " + timeString(end)
} }
fun dateAndTimeString(mills: Long): String { override fun dateAndTimeString(mills: Long): String {
return if (mills == 0L) "" else dateString(mills) + " " + timeString(mills) return if (mills == 0L) "" else dateString(mills) + " " + timeString(mills)
} }
fun dateAndTimeAndSecondsString(mills: Long): String { override fun dateAndTimeAndSecondsString(mills: Long): String {
return if (mills == 0L) "" else dateString(mills) + " " + timeStringWithSeconds(mills) return if (mills == 0L) "" else dateString(mills) + " " + timeStringWithSeconds(mills)
} }
fun minAgo(rh: ResourceHelper, time: Long?): String { override fun minAgo(rh: ResourceHelper, time: Long?): String {
if (time == null) return "" if (time == null) return ""
val minutes = ((now() - time) / 1000 / 60).toInt() val minutes = ((now() - time) / 1000 / 60).toInt()
return rh.gs(R.string.minago, minutes) return rh.gs(R.string.minago, minutes)
} }
fun minAgoShort(time: Long?): String { override fun minAgoShort(time: Long?): String {
if (time == null) return "" if (time == null) return ""
val minutes = ((time - now()) / 1000 / 60).toInt() val minutes = ((time - now()) / 1000 / 60).toInt()
return (if (minutes > 0) "+" else "") + minutes return (if (minutes > 0) "+" else "") + minutes
} }
fun minAgoLong(rh: ResourceHelper, time: Long?): String { override fun minAgoLong(rh: ResourceHelper, time: Long?): String {
if (time == null) return "" if (time == null) return ""
val minutes = ((now() - time) / 1000 / 60).toInt() val minutes = ((now() - time) / 1000 / 60).toInt()
return rh.gs(R.string.minago_long, minutes) return rh.gs(R.string.minago_long, minutes)
} }
fun hourAgo(time: Long, rh: ResourceHelper): String { override fun hourAgo(time: Long, rh: ResourceHelper): String {
val hours = (now() - time) / 1000.0 / 60 / 60 val hours = (now() - time) / 1000.0 / 60 / 60
return rh.gs(R.string.hoursago, hours) return rh.gs(R.string.hoursago, hours)
} }
fun dayAgo(time: Long, rh: ResourceHelper, round: Boolean = false): String { override fun dayAgo(time: Long, rh: ResourceHelper, round: Boolean): String {
var days = (now() - time) / 1000.0 / 60 / 60 / 24 var days = (now() - time) / 1000.0 / 60 / 60 / 24
if (round) { if (round) {
return if (now() > time) { return if (now() > time) {
@ -251,7 +251,7 @@ class DateUtil @Inject constructor(private val context: Context) {
rh.gs(R.string.in_days, days) rh.gs(R.string.in_days, days)
} }
fun beginOfDay(mills: Long): Long { override fun beginOfDay(mills: Long): Long {
val givenDate = Calendar.getInstance() val givenDate = Calendar.getInstance()
givenDate.timeInMillis = mills givenDate.timeInMillis = mills
givenDate[Calendar.HOUR_OF_DAY] = 0 givenDate[Calendar.HOUR_OF_DAY] = 0
@ -261,7 +261,7 @@ class DateUtil @Inject constructor(private val context: Context) {
return givenDate.timeInMillis return givenDate.timeInMillis
} }
fun timeStringFromSeconds(seconds: Int): String { override fun timeStringFromSeconds(seconds: Int): String {
val cached = timeStrings[seconds.toLong()] val cached = timeStrings[seconds.toLong()]
if (cached != null) return cached if (cached != null) return cached
val t = timeString(secondsOfTheDayToMilliseconds(seconds)) val t = timeString(secondsOfTheDayToMilliseconds(seconds))
@ -269,47 +269,47 @@ class DateUtil @Inject constructor(private val context: Context) {
return t return t
} }
fun timeFrameString(timeInMillis: Long, rh: ResourceHelper): String { override fun timeFrameString(timeInMillis: Long, rh: ResourceHelper): String {
var remainingTimeMinutes = timeInMillis / (1000 * 60) var remainingTimeMinutes = timeInMillis / (1000 * 60)
val remainingTimeHours = remainingTimeMinutes / 60 val remainingTimeHours = remainingTimeMinutes / 60
remainingTimeMinutes %= 60 remainingTimeMinutes %= 60
return "(" + (if (remainingTimeHours > 0) remainingTimeHours.toString() + rh.gs(R.string.shorthour) + " " else "") + remainingTimeMinutes + "')" return "(" + (if (remainingTimeHours > 0) remainingTimeHours.toString() + rh.gs(R.string.shorthour) + " " else "") + remainingTimeMinutes + "')"
} }
fun sinceString(timestamp: Long, rh: ResourceHelper): String { override fun sinceString(timestamp: Long, rh: ResourceHelper): String {
return timeFrameString(System.currentTimeMillis() - timestamp, rh) return timeFrameString(System.currentTimeMillis() - timestamp, rh)
} }
fun untilString(timestamp: Long, rh: ResourceHelper): String { override fun untilString(timestamp: Long, rh: ResourceHelper): String {
return timeFrameString(timestamp - System.currentTimeMillis(), rh) return timeFrameString(timestamp - System.currentTimeMillis(), rh)
} }
fun now(): Long { override fun now(): Long {
return System.currentTimeMillis() return System.currentTimeMillis()
} }
fun nowWithoutMilliseconds(): Long { override fun nowWithoutMilliseconds(): Long {
var n = System.currentTimeMillis() var n = System.currentTimeMillis()
n -= n % 1000 n -= n % 1000
return n return n
} }
fun isOlderThan(date: Long, minutes: Long): Boolean { override fun isOlderThan(date: Long, minutes: Long): Boolean {
val diff = now() - date val diff = now() - date
return diff > T.mins(minutes).msecs() return diff > T.mins(minutes).msecs()
} }
fun getTimeZoneOffsetMs(): Long { override fun getTimeZoneOffsetMs(): Long {
return GregorianCalendar().timeZone.rawOffset.toLong() return GregorianCalendar().timeZone.rawOffset.toLong()
} }
fun getTimeZoneOffsetMinutes(timestamp: Long): Int { override fun getTimeZoneOffsetMinutes(timestamp: Long): Int {
return TimeZone.getDefault().getOffset(timestamp) / 60000 return TimeZone.getDefault().getOffset(timestamp) / 60000
} }
fun isSameDay(timestamp1: Long, timestamp2: Long) = isSameDay(Date(timestamp1), Date(timestamp2)) override fun isSameDay(timestamp1: Long, timestamp2: Long) = isSameDay(Date(timestamp1), Date(timestamp2))
fun isSameDayGroup(timestamp1: Long, timestamp2: Long): Boolean { override fun isSameDayGroup(timestamp1: Long, timestamp2: Long): Boolean {
val now = now() val now = now()
if (now in (timestamp1 + 1) until timestamp2 || now in (timestamp2 + 1) until timestamp1) if (now in (timestamp1 + 1) until timestamp2 || now in (timestamp2 + 1) until timestamp1)
return false return false
@ -317,7 +317,7 @@ class DateUtil @Inject constructor(private val context: Context) {
} }
//Map:{DAYS=1, HOURS=3, MINUTES=46, SECONDS=40, MILLISECONDS=0, MICROSECONDS=0, NANOSECONDS=0} //Map:{DAYS=1, HOURS=3, MINUTES=46, SECONDS=40, MILLISECONDS=0, MICROSECONDS=0, NANOSECONDS=0}
fun computeDiff(date1: Long, date2: Long): Map<TimeUnit, Long> { override fun computeDiff(date1: Long, date2: Long): Map<TimeUnit, Long> {
val units: MutableList<TimeUnit> = ArrayList(EnumSet.allOf(TimeUnit::class.java)) val units: MutableList<TimeUnit> = ArrayList(EnumSet.allOf(TimeUnit::class.java))
units.reverse() units.reverse()
val result: MutableMap<TimeUnit, Long> = LinkedHashMap() val result: MutableMap<TimeUnit, Long> = LinkedHashMap()
@ -331,7 +331,7 @@ class DateUtil @Inject constructor(private val context: Context) {
return result return result
} }
fun age(milliseconds: Long, useShortText: Boolean, rh: ResourceHelper): String { override fun age(milliseconds: Long, useShortText: Boolean, rh: ResourceHelper): String {
val diff = computeDiff(0L, milliseconds) val diff = computeDiff(0L, milliseconds)
var days = " " + rh.gs(R.string.days) + " " var days = " " + rh.gs(R.string.days) + " "
var hours = " " + rh.gs(R.string.hours) + " " var hours = " " + rh.gs(R.string.hours) + " "
@ -348,7 +348,7 @@ class DateUtil @Inject constructor(private val context: Context) {
return result return result
} }
fun niceTimeScalar(time: Long, rh: ResourceHelper): String { override fun niceTimeScalar(time: Long, rh: ResourceHelper): String {
var t = time var t = time
var unit = rh.gs(R.string.unit_second) var unit = rh.gs(R.string.unit_second)
t /= 1000 t /= 1000
@ -378,7 +378,7 @@ class DateUtil @Inject constructor(private val context: Context) {
return qs(t.toDouble(), 0) + " " + unit return qs(t.toDouble(), 0) + " " + unit
} }
fun qs(x: Double, numDigits: Int): String { override fun qs(x: Double, numDigits: Int): String {
var digits = numDigits var digits = numDigits
if (digits == -1) { if (digits == -1) {
digits = 0 digits = 0
@ -411,7 +411,7 @@ class DateUtil @Inject constructor(private val context: Context) {
return thisDf?.format(x) ?: "" return thisDf?.format(x) ?: ""
} }
fun formatHHMM(timeAsSeconds: Int): String { override fun formatHHMM(timeAsSeconds: Int): String {
val hour = timeAsSeconds / 60 / 60 val hour = timeAsSeconds / 60 / 60
val minutes = (timeAsSeconds - hour * 60 * 60) / 60 val minutes = (timeAsSeconds - hour * 60 * 60) / 60
val df = DecimalFormat("00") val df = DecimalFormat("00")
@ -419,7 +419,7 @@ class DateUtil @Inject constructor(private val context: Context) {
} }
@RequiresApi(Build.VERSION_CODES.O) @RequiresApi(Build.VERSION_CODES.O)
fun timeZoneByOffset(offsetInMilliseconds: Long): TimeZone = override fun timeZoneByOffset(offsetInMilliseconds: Long): TimeZone =
TimeZone.getTimeZone( TimeZone.getTimeZone(
if (offsetInMilliseconds == 0L) ZoneId.of("UTC") if (offsetInMilliseconds == 0L) ZoneId.of("UTC")
else ZoneId.getAvailableZoneIds() else ZoneId.getAvailableZoneIds()
@ -430,7 +430,7 @@ class DateUtil @Inject constructor(private val context: Context) {
.firstOrNull() ?: ZoneId.of("UTC") .firstOrNull() ?: ZoneId.of("UTC")
) )
fun timeStampToUtcDateMillis(timestamp: Long): Long { override fun timeStampToUtcDateMillis(timestamp: Long): Long {
val current = Calendar.getInstance().apply { timeInMillis = timestamp } val current = Calendar.getInstance().apply { timeInMillis = timestamp }
return Calendar.getInstance().apply { return Calendar.getInstance().apply {
set(Calendar.YEAR, current[Calendar.YEAR]) set(Calendar.YEAR, current[Calendar.YEAR])
@ -439,7 +439,7 @@ class DateUtil @Inject constructor(private val context: Context) {
}.timeInMillis }.timeInMillis
} }
fun mergeUtcDateToTimestamp(timestamp: Long, dateUtcMillis: Long): Long { override fun mergeUtcDateToTimestamp(timestamp: Long, dateUtcMillis: Long): Long {
val selected = Calendar.getInstance().apply { timeInMillis = dateUtcMillis } val selected = Calendar.getInstance().apply { timeInMillis = dateUtcMillis }
return Calendar.getInstance().apply { return Calendar.getInstance().apply {
timeInMillis = timestamp timeInMillis = timestamp
@ -449,7 +449,7 @@ class DateUtil @Inject constructor(private val context: Context) {
}.timeInMillis }.timeInMillis
} }
fun mergeHourMinuteToTimestamp(timestamp: Long, hour: Int, minute: Int, randomSecond: Boolean = false): Long { override fun mergeHourMinuteToTimestamp(timestamp: Long, hour: Int, minute: Int, randomSecond: Boolean): Long {
return Calendar.getInstance().apply { return Calendar.getInstance().apply {
timeInMillis = timestamp timeInMillis = timestamp
set(Calendar.HOUR_OF_DAY, hour) set(Calendar.HOUR_OF_DAY, hour)

View file

@ -3,7 +3,7 @@
android:height="24dp" android:height="24dp"
android:viewportWidth="24" android:viewportWidth="24"
android:viewportHeight="24"> android:viewportHeight="24">
<path <path
android:fillColor="#FF000000" android:fillColor="#FF000000"
android:pathData="M0.103,0h24v24h-24z"/> android:pathData="M0.103,0h24v24h-24z" />
</vector> </vector>

View file

@ -0,0 +1,306 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="400dp"
android:height="400dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#00000000"
android:pathData="M10.744,0.074L10.885,1.416"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M13.113,22.599L13.254,23.942"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M9.504,0.27L9.784,1.591"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M14.214,22.425L14.495,23.745"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M8.29,0.595L8.708,1.88"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M15.291,22.136L15.708,23.42"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M7.118,1.046L7.667,2.279"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M16.332,21.737L16.881,22.97"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M4.945,2.3L5.739,3.392"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M18.26,20.623L19.053,21.716"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M3.969,3.091L4.873,4.094"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19.126,19.922L20.029,20.925"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M3.081,3.979L4.084,4.882"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19.914,19.133L20.917,20.037"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M2.291,4.955L3.383,5.749"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M20.616,18.267L21.708,19.061"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M1.036,7.128L2.27,7.677"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M21.729,16.339L22.962,16.888"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0.586,8.3L1.871,8.718"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M22.128,15.298L23.412,15.715"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0.261,9.514L1.582,9.794"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M22.416,14.221L23.737,14.502"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0.065,10.754L1.408,10.895"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M22.591,13.12L23.934,13.261"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0.065,13.263L1.408,13.122"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M22.591,10.894L23.933,10.753"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0.262,14.503L1.582,14.223"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M22.416,9.793L23.737,9.512"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0.587,15.717L1.871,15.299"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M22.128,8.716L23.412,8.299"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M1.037,16.889L2.271,16.34"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M21.728,7.676L22.962,7.126"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M2.291,19.062L3.384,18.268"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M20.615,5.747L21.707,4.954"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M3.082,20.038L4.085,19.134"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19.913,4.881L20.917,3.978"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M3.97,20.926L4.874,19.923"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19.125,4.093L20.028,3.09"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M4.946,21.716L5.74,20.624"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M18.258,3.392L19.052,2.299"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M7.119,22.971L7.668,21.737"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M16.33,2.278L16.879,1.045"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M8.292,23.421L8.709,22.137"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M15.29,1.879L15.707,0.595"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M9.505,23.746L9.786,22.425"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M14.213,1.591L14.494,0.27"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M10.746,23.942L10.887,22.599"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M13.112,1.416L13.253,0.073"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#FFFFFF"
android:pathData="M11.999,0.008L11.999,2.708"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#FFFFFF"
android:pathData="M11.999,21.307L11.999,24.008"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#FFFFFF"
android:pathData="M23.999,12L21.298,12"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#FFFFFF"
android:pathData="M2.699,12L-0.001,12"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#FFFFFF"
android:pathData="M5.999,1.616L7.349,3.954"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#FFFFFF"
android:pathData="M16.648,20.061L17.999,22.4"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#FFFFFF"
android:pathData="M22.387,6.001L20.048,7.351"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#FFFFFF"
android:pathData="M3.941,16.651L1.602,18.001"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#FFFFFF"
android:pathData="M1.606,6.008L3.945,7.358"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#FFFFFF"
android:pathData="M20.052,16.658L22.391,18.008"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#FFFFFF"
android:pathData="M17.992,1.612L16.642,3.95"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#FFFFFF"
android:pathData="M7.342,20.057L5.992,22.396"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
</vector>

View file

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="400dp"
android:height="400dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFFFFF"
android:pathData="M11.999,4.906c-0.104,0 -0.188,0.084 -0.188,0.188V12c0,0.104 0.084,0.188 0.188,0.188c0.104,0 0.188,-0.084 0.188,-0.188V5.094C12.186,4.99 12.102,4.906 11.999,4.906zM11.999,12.094c-0.047,0 -0.086,-0.038 -0.086,-0.086s0.039,-0.086 0.086,-0.086c0.047,0 0.086,0.038 0.086,0.086S12.046,12.094 11.999,12.094z" />
</vector>

View file

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="400dp"
android:height="400dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFFFFF"
android:pathData="M11.999,1.406c-0.104,0 -0.188,0.084 -0.188,0.188V12c0,0.104 0.084,0.188 0.188,0.188c0.104,0 0.188,-0.084 0.188,-0.188V1.594C12.186,1.49 12.102,1.406 11.999,1.406zM11.999,12.094c-0.047,0 -0.086,-0.038 -0.086,-0.086s0.039,-0.086 0.086,-0.086c0.047,0 0.086,0.038 0.086,0.086S12.046,12.094 11.999,12.094z" />
</vector>

View file

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="400dp"
android:height="400dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FF1313"
android:pathData="M12.198,11.462v-0.237c0,-0.077 -0.05,-0.131 -0.114,-0.164V0.508c0,-0.047 -0.038,-0.086 -0.086,-0.086c-0.047,0 -0.086,0.038 -0.086,0.086v10.553c-0.063,0.033 -0.114,0.087 -0.114,0.164v0.238c-0.219,0.082 -0.376,0.29 -0.376,0.537s0.157,0.455 0.376,0.537v0.92c0,0.11 0.089,0.2 0.2,0.2s0.2,-0.089 0.2,-0.2v-0.919c0.221,-0.081 0.381,-0.289 0.381,-0.538S12.419,11.543 12.198,11.462zM11.999,12.094c-0.047,0 -0.086,-0.038 -0.086,-0.086s0.039,-0.086 0.086,-0.086c0.047,0 0.086,0.038 0.086,0.086S12.046,12.094 11.999,12.094z" />
</vector>

View file

@ -0,0 +1,66 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="400dp"
android:height="400dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFFFFF"
android:pathData="M11.999,0.008L11.999,2.708"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#FFFFFF"
android:pathData="M11.999,21.307L11.999,24.008"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#FFFFFF"
android:pathData="M23.999,12L21.298,12"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#FFFFFF"
android:pathData="M2.699,12L-0.001,12"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#FFFFFF"
android:pathData="M5.999,1.616L7.349,3.954"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#FFFFFF"
android:pathData="M16.648,20.061L17.999,22.4"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#FFFFFF"
android:pathData="M22.387,6.001L20.048,7.351"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#FFFFFF"
android:pathData="M3.941,16.651L1.602,18.001"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#FFFFFF"
android:pathData="M1.606,6.008L3.945,7.358"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#FFFFFF"
android:pathData="M20.052,16.658L22.391,18.008"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#FFFFFF"
android:pathData="M17.992,1.612L16.642,3.95"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
<path
android:fillColor="#FFFFFF"
android:pathData="M7.342,20.057L5.992,22.396"
android:strokeWidth="0.1417"
android:strokeColor="#FFFFFF" />
</vector>

View file

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 41 KiB

View file

@ -1,8 +1,8 @@
package info.nightscout.shared.impl.logging package info.nightscout.shared.impl.logging
import com.google.common.truth.Truth.assertThat
import info.nightscout.rx.logging.LTag import info.nightscout.rx.logging.LTag
import info.nightscout.shared.sharedPreferences.SP import info.nightscout.shared.sharedPreferences.SP
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith import org.junit.jupiter.api.extension.ExtendWith
@ -26,13 +26,13 @@ class LImplTest {
@Test @Test
fun findByName() { fun findByName() {
Assertions.assertEquals(LTag.APS.name, sut.findByName("APS").name) assertThat(sut.findByName("APS").name).isEqualTo(LTag.APS.name)
Assertions.assertEquals("NONEXISTENT", sut.findByName("APS2").name) assertThat(sut.findByName("APS2").name).isEqualTo("NONEXISTENT")
} }
@Test @Test
fun getLogElements() { fun getLogElements() {
Assertions.assertTrue(sut.getLogElements().isNotEmpty()) assertThat(sut.getLogElements()).isNotEmpty()
} }
@Test @Test
@ -40,6 +40,6 @@ class LImplTest {
val element = sut.findByName("APS") val element = sut.findByName("APS")
element.enabled = false element.enabled = false
sut.resetToDefaults() sut.resetToDefaults()
Assertions.assertTrue(element.enabled) assertThat(element.enabled).isTrue()
} }
} }

View file

@ -1,8 +1,8 @@
package info.nightscout.shared.impl.sharedPreferences package info.nightscout.shared.impl.sharedPreferences
import com.google.common.truth.Truth.assertThat
import android.content.Context import android.content.Context
import info.nightscout.shared.impl.SharedPreferencesMock import info.nightscout.shared.impl.SharedPreferencesMock
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith import org.junit.jupiter.api.extension.ExtendWith
@ -34,153 +34,153 @@ class SPImplementationTest {
@Test @Test
fun edit() { fun edit() {
sut.edit { putBoolean("test", true) } sut.edit { putBoolean("test", true) }
Assertions.assertTrue(sut.getBoolean("test", false)) assertThat(sut.getBoolean("test", false)).isTrue()
sut.edit { remove("test") } sut.edit { remove("test") }
Assertions.assertFalse(sut.contains("test")) assertThat(sut.contains("test")).isFalse()
sut.edit { putBoolean(someResource, true) } sut.edit { putBoolean(someResource, true) }
Assertions.assertTrue(sut.getBoolean(someResource, false)) assertThat(sut.getBoolean(someResource, false)).isTrue()
sut.edit { remove(someResource) } sut.edit { remove(someResource) }
Assertions.assertFalse(sut.contains(someResource)) assertThat(sut.contains(someResource)).isFalse()
sut.edit(commit = true) { putDouble("test", 1.0) } sut.edit(commit = true) { putDouble("test", 1.0) }
Assertions.assertEquals(1.0, sut.getDouble("test", 2.0)) assertThat(sut.getDouble("test", 2.0)).isEqualTo(1.0)
sut.edit { putDouble(someResource, 1.0) } sut.edit { putDouble(someResource, 1.0) }
Assertions.assertEquals(1.0, sut.getDouble(someResource, 2.0)) assertThat(sut.getDouble(someResource, 2.0)).isEqualTo(1.0)
sut.edit { clear() } sut.edit { clear() }
Assertions.assertFalse(sut.contains(someResource2)) assertThat(sut.contains(someResource2)).isFalse()
sut.edit { putInt("test", 1) } sut.edit { putInt("test", 1) }
Assertions.assertEquals(1, sut.getInt("test", 2)) assertThat(sut.getInt("test", 2)).isEqualTo(1)
sut.edit { putInt(someResource, 1) } sut.edit { putInt(someResource, 1) }
Assertions.assertEquals(1, sut.getInt(someResource, 2)) assertThat(sut.getInt(someResource, 2)).isEqualTo(1)
sut.edit { clear() } sut.edit { clear() }
sut.edit { putLong("test", 1L) } sut.edit { putLong("test", 1L) }
Assertions.assertEquals(1L, sut.getLong("test", 2L)) assertThat(sut.getLong("test", 2L)).isEqualTo(1L)
sut.edit { putLong(someResource, 1) } sut.edit { putLong(someResource, 1) }
Assertions.assertEquals(1L, sut.getLong(someResource, 2L)) assertThat(sut.getLong(someResource, 2L)).isEqualTo(1L)
sut.edit { clear() } sut.edit { clear() }
sut.edit { putString("test", "string") } sut.edit { putString("test", "string") }
Assertions.assertEquals("string", sut.getString("test", "a")) assertThat(sut.getString("test", "a")).isEqualTo("string")
sut.edit { putString(someResource, "string") } sut.edit { putString(someResource, "string") }
Assertions.assertEquals("string", sut.getString(someResource, "a")) assertThat(sut.getString(someResource, "a")).isEqualTo("string")
sut.edit { clear() } sut.edit { clear() }
} }
@Test @Test
fun clear() { fun clear() {
sut.putBoolean("test", true) sut.putBoolean("test", true)
Assertions.assertTrue(sut.getAll().containsKey("test")) assertThat(sut.getAll()).containsKey("test")
sut.clear() sut.clear()
Assertions.assertFalse(sut.getAll().containsKey("test")) assertThat(sut.getAll()).doesNotContainKey("test")
} }
@Test @Test
fun contains() { fun contains() {
sut.putBoolean("test", true) sut.putBoolean("test", true)
Assertions.assertTrue(sut.contains("test")) assertThat(sut.contains("test")).isTrue()
sut.putBoolean(someResource, true) sut.putBoolean(someResource, true)
Assertions.assertTrue(sut.contains(someResource)) assertThat(sut.contains(someResource)).isTrue()
} }
@Test @Test
fun remove() { fun remove() {
sut.putBoolean("test", true) sut.putBoolean("test", true)
sut.remove("test") sut.remove("test")
Assertions.assertFalse(sut.contains("test")) assertThat(sut.contains("test")).isFalse()
sut.putBoolean(someResource, true) sut.putBoolean(someResource, true)
sut.remove(someResource) sut.remove(someResource)
Assertions.assertFalse(sut.contains(someResource)) assertThat(sut.contains(someResource)).isFalse()
} }
@Test @Test
fun getString() { fun getString() {
sut.putString("test", "string") sut.putString("test", "string")
Assertions.assertTrue(sut.getString("test", "") == "string") assertThat(sut.getString("test", "")).isEqualTo("string")
Assertions.assertTrue(sut.getString("test1", "") == "") assertThat(sut.getString("test1", "")).isEmpty()
sut.putString(someResource, "string") sut.putString(someResource, "string")
Assertions.assertTrue(sut.getString(someResource, "") == "string") assertThat(sut.getString(someResource, "")).isEqualTo("string")
Assertions.assertTrue(sut.getString(someResource2, "") == "") assertThat(sut.getString(someResource2, "")).isEmpty()
} }
@Test @Test
fun getStringOrNull() { fun getStringOrNull() {
sut.putString("test", "string") sut.putString("test", "string")
Assertions.assertTrue(sut.getStringOrNull("test", "") == "string") assertThat(sut.getStringOrNull("test", "")).isEqualTo("string")
Assertions.assertNull(sut.getStringOrNull("test1", null)) assertThat(sut.getStringOrNull("test1", null)).isNull()
sut.putString(someResource, "string") sut.putString(someResource, "string")
Assertions.assertTrue(sut.getStringOrNull(someResource, null) == "string") assertThat(sut.getStringOrNull(someResource, null)).isEqualTo("string")
Assertions.assertNull(sut.getStringOrNull(someResource2, null)) assertThat(sut.getStringOrNull(someResource2, null)).isNull()
} }
@Test @Test
fun getBoolean() { fun getBoolean() {
sut.putBoolean("test", true) sut.putBoolean("test", true)
Assertions.assertTrue(sut.getBoolean("test", false)) assertThat(sut.getBoolean("test", false)).isTrue()
sut.putBoolean(someResource, true) sut.putBoolean(someResource, true)
Assertions.assertTrue(sut.getBoolean(someResource, false)) assertThat(sut.getBoolean(someResource, false)).isTrue()
sut.putString("string_key", "a") sut.putString("string_key", "a")
Assertions.assertTrue(sut.getBoolean("string_key", true)) assertThat(sut.getBoolean("string_key", true)).isTrue()
sut.putString(someResource, "a") sut.putString(someResource, "a")
Assertions.assertTrue(sut.getBoolean(someResource, true)) assertThat(sut.getBoolean(someResource, true)).isTrue()
} }
@Test @Test
fun getDouble() { fun getDouble() {
sut.putDouble("test", 1.0) sut.putDouble("test", 1.0)
Assertions.assertEquals(1.0, sut.getDouble("test", 2.0)) assertThat(sut.getDouble("test", 2.0)).isEqualTo(1.0)
Assertions.assertEquals(2.0, sut.getDouble("test1", 2.0)) assertThat(sut.getDouble("test1", 2.0)).isEqualTo(2.0)
sut.putDouble(someResource, 1.0) sut.putDouble(someResource, 1.0)
Assertions.assertEquals(1.0, sut.getDouble(someResource, 2.0)) assertThat(sut.getDouble(someResource, 2.0)).isEqualTo(1.0)
Assertions.assertEquals(2.0, sut.getDouble(someResource2, 2.0)) assertThat(sut.getDouble(someResource2, 2.0)).isEqualTo(2.0)
sut.putString("string_key", "a") sut.putString("string_key", "a")
Assertions.assertEquals(1.0, sut.getDouble("string_key", 1.0)) assertThat(sut.getDouble("string_key", 1.0)).isEqualTo(1.0)
sut.putString(someResource, "a") sut.putString(someResource, "a")
Assertions.assertEquals(1.0, sut.getDouble(someResource, 1.0)) assertThat(sut.getDouble(someResource, 1.0)).isEqualTo(1.0)
} }
@Test @Test
fun getInt() { fun getInt() {
sut.putInt("test", 1) sut.putInt("test", 1)
Assertions.assertEquals(1, sut.getInt("test", 2)) assertThat(sut.getInt("test", 2)).isEqualTo(1)
Assertions.assertEquals(2, sut.getInt("test1", 2)) assertThat(sut.getInt("test1", 2)).isEqualTo(2)
sut.putInt(someResource, 1) sut.putInt(someResource, 1)
Assertions.assertEquals(1, sut.getInt(someResource, 2)) assertThat(sut.getInt(someResource, 2)).isEqualTo(1)
Assertions.assertEquals(2, sut.getInt(someResource2, 2)) assertThat(sut.getInt(someResource2, 2)).isEqualTo(2)
sut.putString("string_key", "a") sut.putString("string_key", "a")
Assertions.assertEquals(1, sut.getInt("string_key", 1)) assertThat(sut.getInt("string_key", 1)).isEqualTo(1)
sut.putString(someResource, "a") sut.putString(someResource, "a")
Assertions.assertEquals(1, sut.getInt(someResource, 1)) assertThat(sut.getInt(someResource, 1)).isEqualTo(1)
} }
@Test @Test
fun getLong() { fun getLong() {
sut.putLong("test", 1L) sut.putLong("test", 1L)
Assertions.assertEquals(1L, sut.getLong("test", 2L)) assertThat(sut.getLong("test", 2L)).isEqualTo(1L)
Assertions.assertEquals(2L, sut.getLong("test1", 2L)) assertThat(sut.getLong("test1", 2L)).isEqualTo(2L)
sut.putLong(someResource, 1L) sut.putLong(someResource, 1L)
Assertions.assertEquals(1L, sut.getLong(someResource, 2L)) assertThat(sut.getLong(someResource, 2L)).isEqualTo(1L)
Assertions.assertEquals(2L, sut.getLong(someResource2, 2L)) assertThat(sut.getLong(someResource2, 2L)).isEqualTo(2L)
sut.putString("string_key", "a") sut.putString("string_key", "a")
Assertions.assertEquals(1L, sut.getLong("string_key", 1L)) assertThat(sut.getLong("string_key", 1L)).isEqualTo(1L)
sut.putString(someResource, "a") sut.putString(someResource, "a")
Assertions.assertEquals(1L, sut.getLong(someResource, 1L)) assertThat(sut.getLong(someResource, 1L)).isEqualTo(1L)
} }
@Test @Test
fun incLong() { fun incLong() {
sut.incLong(someResource) sut.incLong(someResource)
Assertions.assertEquals(1L, sut.getLong(someResource, 3L)) assertThat(sut.getLong(someResource, 3L)).isEqualTo(1L)
sut.incLong(someResource) sut.incLong(someResource)
Assertions.assertEquals(2L, sut.getLong(someResource, 3L)) assertThat(sut.getLong(someResource, 3L)).isEqualTo(2L)
} }
@Test @Test
fun incInt() { fun incInt() {
sut.incInt(someResource) sut.incInt(someResource)
Assertions.assertEquals(1, sut.getInt(someResource, 3)) assertThat(sut.getInt(someResource, 3)).isEqualTo(1)
sut.incInt(someResource) sut.incInt(someResource)
Assertions.assertEquals(2, sut.getInt(someResource, 3)) assertThat(sut.getInt(someResource, 3)).isEqualTo(2)
} }
} }

View file

@ -14,16 +14,17 @@ apply from: "${project.rootDir}/core/main/jacoco_global.gradle"
android { android {
namespace 'info.nightscout.sharedtests' namespace 'info.nightscout.sharedtests'
} }
dependencies { dependencies {
implementation project(':database:entities') implementation project(':database:entities')
implementation project(':app-wear-shared:shared') implementation project(':app-wear-shared:shared-impl')
implementation project(':core:interfaces') implementation project(':core:interfaces')
implementation project(':core:main') implementation project(':core:main')
implementation project(':core:utils') implementation project(':core:utils')
implementation project(':implementation') implementation project(':implementation')
api "org.mockito:mockito-junit-jupiter:$mockito_version" api "org.mockito:mockito-junit-jupiter:$mockito_version"
api "org.mockito.kotlin:mockito-kotlin:5.1.0" api "org.mockito.kotlin:mockito-kotlin:5.1.0"
api "org.junit.jupiter:junit-jupiter-api:$junit_jupiter_version" api "org.junit.jupiter:junit-jupiter-api:$junit_jupiter_version"

View file

@ -1,4 +1,7 @@
package info.nightscout.rx.logging package info.nightscout.sharedtests
import info.nightscout.rx.logging.AAPSLogger
import info.nightscout.rx.logging.LTag
/** /**
* Created by adrian on 2019-12-27. * Created by adrian on 2019-12-27.

View file

@ -2,8 +2,9 @@ package info.nightscout.sharedtests
import android.annotation.SuppressLint import android.annotation.SuppressLint
import info.nightscout.rx.AapsSchedulers import info.nightscout.rx.AapsSchedulers
import info.nightscout.rx.TestAapsSchedulers import info.nightscout.rx.bus.RxBus
import info.nightscout.rx.logging.AAPSLoggerTest import info.nightscout.shared.impl.rx.bus.RxBusImpl
import info.nightscout.sharedtests.rx.TestAapsSchedulers
import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.extension.ExtendWith import org.junit.jupiter.api.extension.ExtendWith
import org.mockito.ArgumentMatcher import org.mockito.ArgumentMatcher
@ -20,11 +21,13 @@ open class TestBase {
val aapsLogger = AAPSLoggerTest() val aapsLogger = AAPSLoggerTest()
val aapsSchedulers: AapsSchedulers = TestAapsSchedulers() val aapsSchedulers: AapsSchedulers = TestAapsSchedulers()
lateinit var rxBus: RxBus
@BeforeEach @BeforeEach
fun setupLocale() { fun setupLocale() {
Locale.setDefault(Locale.ENGLISH) Locale.setDefault(Locale.ENGLISH)
System.setProperty("disableFirebase", "true") System.setProperty("disableFirebase", "true")
rxBus = RxBusImpl(aapsSchedulers, aapsLogger)
} }
@SuppressLint("CheckResult") @SuppressLint("CheckResult")

View file

@ -19,11 +19,11 @@ import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.interfaces.profile.ProfileStore import info.nightscout.interfaces.profile.ProfileStore
import info.nightscout.interfaces.utils.DecimalFormatter import info.nightscout.interfaces.utils.DecimalFormatter
import info.nightscout.interfaces.utils.HardLimits import info.nightscout.interfaces.utils.HardLimits
import info.nightscout.rx.bus.RxBus
import info.nightscout.shared.interfaces.ProfileUtil import info.nightscout.shared.interfaces.ProfileUtil
import info.nightscout.shared.interfaces.ResourceHelper import info.nightscout.shared.interfaces.ResourceHelper
import info.nightscout.shared.sharedPreferences.SP import info.nightscout.shared.sharedPreferences.SP
import info.nightscout.shared.utils.DateUtil import info.nightscout.shared.utils.DateUtil
import info.nightscout.shared.utils.DateUtilImpl
import org.json.JSONObject import org.json.JSONObject
import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.BeforeEach
import org.mockito.ArgumentMatchers.anyDouble import org.mockito.ArgumentMatchers.anyDouble
@ -49,7 +49,6 @@ open class TestBaseWithProfile : TestBase() {
lateinit var profileUtil: ProfileUtil lateinit var profileUtil: ProfileUtil
lateinit var decimalFormatter: DecimalFormatter lateinit var decimalFormatter: DecimalFormatter
lateinit var hardLimits: HardLimits lateinit var hardLimits: HardLimits
val rxBus = RxBus(aapsSchedulers, aapsLogger)
val profileInjector = HasAndroidInjector { val profileInjector = HasAndroidInjector {
AndroidInjector { AndroidInjector {
@ -82,7 +81,7 @@ open class TestBaseWithProfile : TestBase() {
invalidProfileJSON = "{\"dia\":\"1\",\"carbratio\":[{\"time\":\"00:00\",\"value\":\"30\"}],\"carbs_hr\":\"20\",\"delay\":\"20\",\"sens\":[{\"time\":\"00:00\",\"value\":\"3\"}," + invalidProfileJSON = "{\"dia\":\"1\",\"carbratio\":[{\"time\":\"00:00\",\"value\":\"30\"}],\"carbs_hr\":\"20\",\"delay\":\"20\",\"sens\":[{\"time\":\"00:00\",\"value\":\"3\"}," +
"{\"time\":\"2:00\",\"value\":\"3.4\"}],\"timezone\":\"UTC\",\"basal\":[{\"time\":\"00:00\",\"value\":\"1\"}],\"target_low\":[{\"time\":\"00:00\",\"value\":\"4.5\"}]," + "{\"time\":\"2:00\",\"value\":\"3.4\"}],\"timezone\":\"UTC\",\"basal\":[{\"time\":\"00:00\",\"value\":\"1\"}],\"target_low\":[{\"time\":\"00:00\",\"value\":\"4.5\"}]," +
"\"target_high\":[{\"time\":\"00:00\",\"value\":\"7\"}],\"startDate\":\"1970-01-01T00:00:00.000Z\",\"units\":\"mmol\"}" "\"target_high\":[{\"time\":\"00:00\",\"value\":\"7\"}],\"startDate\":\"1970-01-01T00:00:00.000Z\",\"units\":\"mmol\"}"
dateUtil = Mockito.spy(DateUtil(context)) dateUtil = Mockito.spy(DateUtilImpl(context))
decimalFormatter = DecimalFormatterImpl(rh) decimalFormatter = DecimalFormatterImpl(rh)
profileUtil = ProfileUtilImpl(sp, decimalFormatter) profileUtil = ProfileUtilImpl(sp, decimalFormatter)
testPumpPlugin = TestPumpPlugin(profileInjector) testPumpPlugin = TestPumpPlugin(profileInjector)

View file

@ -0,0 +1,17 @@
package info.nightscout.sharedtests.rx
import info.nightscout.rx.AapsSchedulers
import io.reactivex.rxjava3.core.Scheduler
import io.reactivex.rxjava3.schedulers.Schedulers
/**
* Created by adrian on 12.04.20.
*/
class TestAapsSchedulers : AapsSchedulers {
override val main: Scheduler = Schedulers.trampoline()
override val io: Scheduler = Schedulers.trampoline()
override val cpu: Scheduler = Schedulers.trampoline()
override val newThread: Scheduler = Schedulers.trampoline()
}

View file

@ -1 +0,0 @@
/build

View file

@ -1,44 +0,0 @@
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-kapt'
id 'kotlinx-serialization'
id 'kotlin-allopen'
}
apply from: "${project.rootDir}/core/main/android_dependencies.gradle"
apply from: "${project.rootDir}/core/main/android_module_dependencies.gradle"
apply from: "${project.rootDir}/core/main/allopen_dependencies.gradle"
apply from: "${project.rootDir}/core/main/test_dependencies.gradle"
apply from: "${project.rootDir}/core/main/jacoco_global.gradle"
android {
namespace 'info.nightscout.shared'
defaultConfig {
minSdkVersion 25 // for wear
}
}
dependencies {
api "androidx.preference:preference-ktx:$preferencektx_version"
api "net.danlew:android.joda:$joda_version"
api "com.google.dagger:dagger:$dagger_version"
api "com.google.dagger:dagger-android:$dagger_version"
api "com.google.dagger:dagger-android-support:$dagger_version"
//Logger
api 'org.slf4j:slf4j-api:1.7.36' // 2.0.x breaks logging. Code change needed
api 'com.github.tony19:logback-android:2.0.0'
api "org.jetbrains.kotlinx:kotlinx-serialization-json:$kotlinx_serialization_version"
api "org.jetbrains.kotlinx:kotlinx-serialization-protobuf:$kotlinx_serialization_version"
api "com.caverock:androidsvg:$caverock_androidsvg_version"
api "org.apache.commons:commons-lang3:$commonslang3_version"
//RxBus
api "io.reactivex.rxjava3:rxjava:$rxjava_version"
api "io.reactivex.rxjava3:rxkotlin:$rxkotlin_version"
api "io.reactivex.rxjava3:rxandroid:$rxandroid_version"
}

View file

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

View file

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest>
</manifest>

View file

@ -1,30 +0,0 @@
package info.nightscout.rx
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.core.Scheduler
import io.reactivex.rxjava3.schedulers.Schedulers
/**
* Created by adrian on 12.04.20.
*/
interface AapsSchedulers {
val main: Scheduler
val io: Scheduler
val cpu: Scheduler
val newThread: Scheduler
}
class DefaultAapsSchedulers : AapsSchedulers {
override val main: Scheduler = AndroidSchedulers.mainThread()
override val io: Scheduler = Schedulers.io()
override val cpu: Scheduler = Schedulers.computation()
override val newThread: Scheduler = Schedulers.newThread()
}
class TestAapsSchedulers : AapsSchedulers {
override val main: Scheduler = Schedulers.trampoline()
override val io: Scheduler = Schedulers.trampoline()
override val cpu: Scheduler = Schedulers.trampoline()
override val newThread: Scheduler = Schedulers.trampoline()
}

View file

@ -1,25 +0,0 @@
package info.nightscout.rx.di
import dagger.Module
import dagger.Provides
import info.nightscout.rx.AapsSchedulers
import info.nightscout.rx.DefaultAapsSchedulers
import info.nightscout.rx.interfaces.L
import info.nightscout.rx.logging.AAPSLogger
import info.nightscout.rx.logging.AAPSLoggerProduction
import javax.inject.Singleton
@Module(
includes = [
]
)
open class RxModule {
@Provides
@Singleton
internal fun provideSchedulers(): AapsSchedulers = DefaultAapsSchedulers()
@Provides
@Singleton
fun provideAAPSLogger(l: L): AAPSLogger = AAPSLoggerProduction(l)
}

View file

@ -1,9 +0,0 @@
package info.nightscout.shared.di
import dagger.Module
@Module(
includes = [
]
)
open class SharedModule

View file

@ -1,183 +0,0 @@
<vector android:height="400dp" android:viewportHeight="24"
android:viewportWidth="24" android:width="400dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#00000000"
android:pathData="M10.744,0.074L10.885,1.416"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M13.113,22.599L13.254,23.942"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M9.504,0.27L9.784,1.591"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M14.214,22.425L14.495,23.745"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M8.29,0.595L8.708,1.88"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M15.291,22.136L15.708,23.42"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M7.118,1.046L7.667,2.279"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M16.332,21.737L16.881,22.97"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M4.945,2.3L5.739,3.392"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M18.26,20.623L19.053,21.716"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M3.969,3.091L4.873,4.094"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M19.126,19.922L20.029,20.925"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M3.081,3.979L4.084,4.882"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M19.914,19.133L20.917,20.037"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M2.291,4.955L3.383,5.749"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M20.616,18.267L21.708,19.061"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M1.036,7.128L2.27,7.677"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M21.729,16.339L22.962,16.888"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M0.586,8.3L1.871,8.718"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M22.128,15.298L23.412,15.715"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M0.261,9.514L1.582,9.794"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M22.416,14.221L23.737,14.502"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M0.065,10.754L1.408,10.895"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M22.591,13.12L23.934,13.261"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M0.065,13.263L1.408,13.122"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M22.591,10.894L23.933,10.753"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M0.262,14.503L1.582,14.223"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M22.416,9.793L23.737,9.512"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M0.587,15.717L1.871,15.299"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M22.128,8.716L23.412,8.299"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M1.037,16.889L2.271,16.34"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M21.728,7.676L22.962,7.126"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M2.291,19.062L3.384,18.268"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M20.615,5.747L21.707,4.954"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M3.082,20.038L4.085,19.134"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M19.913,4.881L20.917,3.978"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M3.97,20.926L4.874,19.923"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M19.125,4.093L20.028,3.09"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M4.946,21.716L5.74,20.624"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M18.258,3.392L19.052,2.299"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M7.119,22.971L7.668,21.737"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M16.33,2.278L16.879,1.045"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M8.292,23.421L8.709,22.137"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M15.29,1.879L15.707,0.595"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M9.505,23.746L9.786,22.425"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M14.213,1.591L14.494,0.27"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M10.746,23.942L10.887,22.599"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#00000000"
android:pathData="M13.112,1.416L13.253,0.073"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#FFFFFF"
android:pathData="M11.999,0.008L11.999,2.708"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#FFFFFF"
android:pathData="M11.999,21.307L11.999,24.008"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#FFFFFF"
android:pathData="M23.999,12L21.298,12"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#FFFFFF"
android:pathData="M2.699,12L-0.001,12"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#FFFFFF"
android:pathData="M5.999,1.616L7.349,3.954"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#FFFFFF"
android:pathData="M16.648,20.061L17.999,22.4"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#FFFFFF"
android:pathData="M22.387,6.001L20.048,7.351"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#FFFFFF"
android:pathData="M3.941,16.651L1.602,18.001"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#FFFFFF"
android:pathData="M1.606,6.008L3.945,7.358"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#FFFFFF"
android:pathData="M20.052,16.658L22.391,18.008"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#FFFFFF"
android:pathData="M17.992,1.612L16.642,3.95"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#FFFFFF"
android:pathData="M7.342,20.057L5.992,22.396"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
</vector>

View file

@ -1,4 +0,0 @@
<vector android:height="400dp" android:viewportHeight="24"
android:viewportWidth="24" android:width="400dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FFFFFF" android:pathData="M11.999,4.906c-0.104,0 -0.188,0.084 -0.188,0.188V12c0,0.104 0.084,0.188 0.188,0.188c0.104,0 0.188,-0.084 0.188,-0.188V5.094C12.186,4.99 12.102,4.906 11.999,4.906zM11.999,12.094c-0.047,0 -0.086,-0.038 -0.086,-0.086s0.039,-0.086 0.086,-0.086c0.047,0 0.086,0.038 0.086,0.086S12.046,12.094 11.999,12.094z"/>
</vector>

View file

@ -1,4 +0,0 @@
<vector android:height="400dp" android:viewportHeight="24"
android:viewportWidth="24" android:width="400dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FFFFFF" android:pathData="M11.999,1.406c-0.104,0 -0.188,0.084 -0.188,0.188V12c0,0.104 0.084,0.188 0.188,0.188c0.104,0 0.188,-0.084 0.188,-0.188V1.594C12.186,1.49 12.102,1.406 11.999,1.406zM11.999,12.094c-0.047,0 -0.086,-0.038 -0.086,-0.086s0.039,-0.086 0.086,-0.086c0.047,0 0.086,0.038 0.086,0.086S12.046,12.094 11.999,12.094z"/>
</vector>

View file

@ -1,4 +0,0 @@
<vector android:height="400dp" android:viewportHeight="24"
android:viewportWidth="24" android:width="400dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF1313" android:pathData="M12.198,11.462v-0.237c0,-0.077 -0.05,-0.131 -0.114,-0.164V0.508c0,-0.047 -0.038,-0.086 -0.086,-0.086c-0.047,0 -0.086,0.038 -0.086,0.086v10.553c-0.063,0.033 -0.114,0.087 -0.114,0.164v0.238c-0.219,0.082 -0.376,0.29 -0.376,0.537s0.157,0.455 0.376,0.537v0.92c0,0.11 0.089,0.2 0.2,0.2s0.2,-0.089 0.2,-0.2v-0.919c0.221,-0.081 0.381,-0.289 0.381,-0.538S12.419,11.543 12.198,11.462zM11.999,12.094c-0.047,0 -0.086,-0.038 -0.086,-0.086s0.039,-0.086 0.086,-0.086c0.047,0 0.086,0.038 0.086,0.086S12.046,12.094 11.999,12.094z"/>
</vector>

View file

@ -1,39 +0,0 @@
<vector android:height="400dp" android:viewportHeight="24"
android:viewportWidth="24" android:width="400dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FFFFFF"
android:pathData="M11.999,0.008L11.999,2.708"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#FFFFFF"
android:pathData="M11.999,21.307L11.999,24.008"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#FFFFFF"
android:pathData="M23.999,12L21.298,12"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#FFFFFF"
android:pathData="M2.699,12L-0.001,12"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#FFFFFF"
android:pathData="M5.999,1.616L7.349,3.954"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#FFFFFF"
android:pathData="M16.648,20.061L17.999,22.4"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#FFFFFF"
android:pathData="M22.387,6.001L20.048,7.351"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#FFFFFF"
android:pathData="M3.941,16.651L1.602,18.001"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#FFFFFF"
android:pathData="M1.606,6.008L3.945,7.358"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#FFFFFF"
android:pathData="M20.052,16.658L22.391,18.008"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#FFFFFF"
android:pathData="M17.992,1.612L16.642,3.95"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
<path android:fillColor="#FFFFFF"
android:pathData="M7.342,20.057L5.992,22.396"
android:strokeColor="#FFFFFF" android:strokeWidth="0.1417"/>
</vector>

View file

@ -1,25 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- DateUtil-->
<string name="shorthour">h</string>
<string name="days">dae</string>
<string name="hours">ure</string>
<string name="unit_second">sekonde</string>
<string name="unit_minute">minuut</string>
<string name="unit_hour">uur</string>
<string name="unit_day">dag</string>
<string name="unit_week">week</string>
<string name="unit_seconds">sekondes</string>
<string name="unit_minutes">minute</string>
<string name="unit_hours">ure</string>
<string name="unit_days">dae</string>
<string name="unit_weeks">weke</string>
<string name="shortminute">m</string>
<string name="shortday">d</string>
<!-- Rx -->
<string name="connecting_for">Koppel vir %1$d s</string>
<string name="handshaking">Handskudding</string>
<string name="connected">Gekoppel</string>
<string name="disconnecting">Ontkoppel</string>
<!-- Custom Watchface -->
</resources>

View file

@ -1,92 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- DateUtil-->
<string name="minago">преди %1$d мин</string>
<string name="minago_long">Преди %1$d минути</string>
<string name="hoursago">преди %1$.1f ч</string>
<string name="days_ago">преди %1$.1f дни</string>
<string name="days_ago_round">преди %1$.0f дни</string>
<string name="in_days">за %1$.0f дни</string>
<string name="in_days_round">за %1$.0f дни</string>
<string name="shorthour">ч</string>
<string name="days">дни</string>
<string name="hours">часа</string>
<string name="unit_second">секунда</string>
<string name="unit_minute">минута</string>
<string name="unit_hour">час</string>
<string name="unit_day">ден</string>
<string name="unit_week">седмица</string>
<string name="unit_seconds">секунди</string>
<string name="unit_minutes">минути</string>
<string name="unit_hours">часове</string>
<string name="unit_days">дни</string>
<string name="unit_weeks">седмици</string>
<string name="shortminute">м</string>
<string name="shortday">д</string>
<string name="later_today">По-късно днес</string>
<string name="tomorrow">Утре</string>
<string name="today">Днес</string>
<string name="yesterday">Вчера</string>
<!-- Rx -->
<string name="connecting_for">Свързване %1$d сек</string>
<string name="handshaking">Сдвояване</string>
<string name="connected">Свързана</string>
<string name="disconnecting">Разкачане</string>
<string name="waiting_for_disconnection">Изчакване за разкачане</string>
<!-- Custom Watchface -->
<string name="metadata_label_watchface_created_at">Създадено: %1$s</string>
<string name="metadata_label_watchface_author">Автор: %1$s</string>
<string name="metadata_label_watchface_name">Име: %1$s</string>
<string name="metadata_wear_import_filename">Име на файла: %1$s</string>
<string name="metadata_label_plugin_version">Plugin версия: %1$s</string>
<string name="metadata_label_watchface_name_version">Име: %1$s (%2$s)</string>
<string name="pref_show_iob">Покажи IOB</string>
<string name="pref_show_detailed_iob">Покажи подробен IOB</string>
<string name="pref_show_cob">Покажи COB</string>
<string name="pref_show_delta">Покажи Делта</string>
<string name="pref_show_detailed_delta">Показвай подробна делта</string>
<string name="pref_show_avgdelta">Покажи средна делта</string>
<string name="pref_show_phone_battery">Покажи батерия на телефон</string>
<string name="pref_show_rig_battery">Покажи батерия на устройство</string>
<string name="pref_show_basal_rate">Покажи базал</string>
<string name="pref_show_loop_status">Покажи Loop Статус</string>
<string name="pref_show_bg">Покажи КЗ</string>
<string name="pref_show_bgi">Покажи BGI</string>
<string name="pref_show_direction_arrow">Покажи делта стрелка</string>
<string name="pref_show_ago">Покажи \"преди\"</string>
<string name="default_custom_watchface_comment">Watchface по подразбиране, можете да изберете бутон ЕКСПОРТИРАНЕ НА WATCHFACE за създаване на шаблон</string>
<string name="wear_default_watchface">Watchface по подразбиране</string>
<string name="cwf_comment_background">Фоново изображение</string>
<string name="cwf_comment_chart">Графики (КЗ, базал, прогнозни криви...)</string>
<string name="cwf_comment_cover_chart">Изображение над графика и под текстови полета</string>
<string name="cwf_comment_freetext1">Свободен текст 1</string>
<string name="cwf_comment_freetext2">Свободен текст 2</string>
<string name="cwf_comment_freetext3">Свободен текст 3</string>
<string name="cwf_comment_freetext4">Свободен текст 4</string>
<string name="cwf_comment_iob1">IOB надпис или IOB Общо (при подробен IOB)</string>
<string name="cwf_comment_iob2">IOB Общо или (Bolus_IOB|Basal_IOB) при подробен IOB</string>
<string name="cwf_comment_cob1">COB надпис</string>
<string name="cwf_comment_cob2">COB стойност</string>
<string name="cwf_comment_delta">Краткоср. Δ</string>
<string name="cwf_comment_avg_delta">Средна делта (15мин)</string>
<string name="cwf_comment_uploader_battery">Батерия на телефона (%)</string>
<string name="cwf_comment_rig_battery">Global loop батерия (%)</string>
<string name="cwf_comment_basalRate">Базал</string>
<string name="cwf_comment_bgi">BGI стойност</string>
<string name="cwf_comment_time">Време (ЧЧ:MM или ЧЧ:MM:СС)</string>
<string name="cwf_comment_hour">Час (ЧЧ)</string>
<string name="cwf_comment_minute">Минути (MM)</string>
<string name="cwf_comment_second">Секунди (СС)</string>
<string name="cwf_comment_timePeriod">AM или PM</string>
<string name="cwf_comment_day_name">Ден от седмицата</string>
<string name="cwf_comment_day">Ден (ДД)</string>
<string name="cwf_comment_month">Месец (кратко)</string>
<string name="cwf_comment_loop">Loop статус и \"преди\"</string>
<string name="cwf_comment_direction">Делта стрелка</string>
<string name="cwf_comment_timestamp">Последно получена КЗ преди минути</string>
<string name="cwf_comment_sgv">КЗ стойност</string>
<string name="cwf_comment_cover_plate">Изображение над текст (циферблат...)</string>
<string name="cwf_comment_hour_hand">Изображение на стрелка за часове (Аналогов часовник)</string>
<string name="cwf_comment_minute_hand">Изображение на стрелка за минути (Аналогов часовник)</string>
<string name="cwf_comment_second_hand">Изображение на стрелка за секунди (Аналогов часовник)</string>
</resources>

View file

@ -1,28 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- DateUtil-->
<string name="minago">Fa %1$d m</string>
<string name="hoursago">Fa %1$.1f h</string>
<string name="shorthour">h</string>
<string name="days">dies</string>
<string name="hours">hores</string>
<string name="unit_second">segon</string>
<string name="unit_minute">minut</string>
<string name="unit_hour">hora</string>
<string name="unit_day">dia</string>
<string name="unit_week">setmana</string>
<string name="unit_seconds">segons</string>
<string name="unit_minutes">minuts</string>
<string name="unit_hours">hores</string>
<string name="unit_days">dies</string>
<string name="unit_weeks">setmanes</string>
<string name="shortminute">m</string>
<string name="shortday">d</string>
<!-- Rx -->
<string name="connecting_for">Connectant %1$d s</string>
<string name="handshaking">Establint comunicació</string>
<string name="connected">Connectat</string>
<string name="disconnecting">Desconnectant</string>
<string name="waiting_for_disconnection">S\'està esperant la desconnexió</string>
<!-- Custom Watchface -->
</resources>

View file

@ -1,93 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- DateUtil-->
<string name="minago">před %1$d min</string>
<string name="minago_long">před %1$d minutamí</string>
<string name="hoursago">před %1$.1f h</string>
<string name="days_ago">Před %1$.1f dny</string>
<string name="days_ago_round">Před %1$.0f dny</string>
<string name="in_days">za %1$.0f dní</string>
<string name="in_days_round">za %1$.0f dní</string>
<string name="shorthour">h</string>
<string name="days">dnů</string>
<string name="hours">hodin</string>
<string name="unit_second">sekund</string>
<string name="unit_minute">minut</string>
<string name="unit_hour">hodina</string>
<string name="unit_day">den</string>
<string name="unit_week">týden</string>
<string name="unit_seconds">sekund</string>
<string name="unit_minutes">minut</string>
<string name="unit_hours">hodin</string>
<string name="unit_days">dní</string>
<string name="unit_weeks">týdnů</string>
<string name="shortminute">m</string>
<string name="shortday">d</string>
<string name="later_today">Později během dneška</string>
<string name="tomorrow">Zítra</string>
<string name="today">Dnes</string>
<string name="yesterday">Včera</string>
<!-- Rx -->
<string name="connecting_for">Připojování %1$d sec</string>
<string name="handshaking">Navazování spojení</string>
<string name="connected">Připojeno</string>
<string name="disconnecting">Odpojuji</string>
<string name="waiting_for_disconnection">Čekám na odpojení</string>
<!-- Custom Watchface -->
<string name="metadata_label_watchface_created_at">Vytvořeno: %1$s</string>
<string name="metadata_label_watchface_author">Autor: %1$s</string>
<string name="metadata_label_watchface_name">Jméno %1$s</string>
<string name="metadata_wear_import_filename">Název souboru: %1$s</string>
<string name="metadata_label_plugin_version">Verze pluginu: %1$s</string>
<string name="metadata_label_watchface_name_version">Jméno: %1$s (%2$s)</string>
<string name="metadata_label_watchface_infos">Informace: %1$s</string>
<string name="pref_show_iob">Zobrazit IOB</string>
<string name="pref_show_detailed_iob">Zobrazit detailní IOB</string>
<string name="pref_show_cob">Zobrazit COB</string>
<string name="pref_show_delta">Zobrazit deltu</string>
<string name="pref_show_detailed_delta">Zobrazit detailní deltu</string>
<string name="pref_show_avgdelta">Zobrazit průměrnou deltu</string>
<string name="pref_show_phone_battery">Zobrazit stav baterie telefonu</string>
<string name="pref_show_rig_battery">Zobrazit stav baterie dalších zařízení</string>
<string name="pref_show_basal_rate">Zobrazit bazál</string>
<string name="pref_show_loop_status">Zobrazit stav smyčky</string>
<string name="pref_show_bg">Zobrazit glykémii</string>
<string name="pref_show_bgi">Zobrazit BGI</string>
<string name="pref_show_direction_arrow">Zobrazit trendovou šipku</string>
<string name="pref_show_ago">Zobrazit aktualizováno před</string>
<string name="default_custom_watchface_comment">Výchozí ciferník. Můžete kliknout na tlačítko EXPORTOVAT CIFERNÍK pro vygenerování šablony</string>
<string name="wear_default_watchface">Výchozí ciferník</string>
<string name="cwf_comment_background">Tapeta</string>
<string name="cwf_comment_chart">Grafy (glykémie, bazály, křivky předpovědí...)</string>
<string name="cwf_comment_cover_chart">Obrázek před grafem a za textovými poli</string>
<string name="cwf_comment_freetext1">Volný text 1</string>
<string name="cwf_comment_freetext2">Volný text 2</string>
<string name="cwf_comment_freetext3">Volný text 3</string>
<string name="cwf_comment_freetext4">Volný text 4</string>
<string name="cwf_comment_iob1">Štítek IOB nebo suma IOB při zapnutých detailech</string>
<string name="cwf_comment_iob2">Suma IOB nebo (Bolus_IOB|Basal_IOB) při zapnutých detailech</string>
<string name="cwf_comment_cob1">Štítek COB</string>
<string name="cwf_comment_cob2">Hodnota COB</string>
<string name="cwf_comment_delta">Krátkodobý průměr</string>
<string name="cwf_comment_avg_delta">Průměrný rozdíl glykémií (15min)</string>
<string name="cwf_comment_uploader_battery">Baterie telefonu (%)</string>
<string name="cwf_comment_rig_battery">Baterie smyčky (%)</string>
<string name="cwf_comment_basalRate">Bazální dávka</string>
<string name="cwf_comment_bgi">Hodnota BGI</string>
<string name="cwf_comment_time">Čas (HH:MM nebo HH:MM:SS)</string>
<string name="cwf_comment_hour">Hodiny (HH)</string>
<string name="cwf_comment_minute">Minuty (MM)</string>
<string name="cwf_comment_second">Sekundy (SS)</string>
<string name="cwf_comment_timePeriod">AM nebo PM</string>
<string name="cwf_comment_day_name">Jméno dne v týdnu</string>
<string name="cwf_comment_day">Den (DD)</string>
<string name="cwf_comment_month">Název měsíce (krátký)</string>
<string name="cwf_comment_loop">Stav smyčky a čas</string>
<string name="cwf_comment_direction">Trendová šipka</string>
<string name="cwf_comment_timestamp">Před minutami pro poslední přijaté glykémie</string>
<string name="cwf_comment_sgv">Hodnota glykémie</string>
<string name="cwf_comment_cover_plate">Úvodní obrázek před textem (vytáčení...)</string>
<string name="cwf_comment_hour_hand">Obrázek hodinové ručičky (Analogové hodinky)</string>
<string name="cwf_comment_minute_hand">Obrázek minutové ručičky (Analogové hodinky)</string>
<string name="cwf_comment_second_hand">Obrázek druhé ručičky (Analogové hodinky)</string>
</resources>

View file

@ -1,93 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- DateUtil-->
<string name="minago">%1$d min. siden</string>
<string name="minago_long">%1$d minutter siden</string>
<string name="hoursago">%1$.1f t siden</string>
<string name="days_ago">%1$.1f dage siden</string>
<string name="days_ago_round">%1$.0f dage siden</string>
<string name="in_days">om %1$.0f dage</string>
<string name="in_days_round">om %1$.0f dage</string>
<string name="shorthour">t</string>
<string name="days">dage</string>
<string name="hours">timer</string>
<string name="unit_second">sekund</string>
<string name="unit_minute">minut</string>
<string name="unit_hour">time</string>
<string name="unit_day">dag</string>
<string name="unit_week">uge</string>
<string name="unit_seconds">sekunder</string>
<string name="unit_minutes">minutter</string>
<string name="unit_hours">timer</string>
<string name="unit_days">dage</string>
<string name="unit_weeks">uger</string>
<string name="shortminute">min</string>
<string name="shortday">d</string>
<string name="later_today">Senere i dag</string>
<string name="tomorrow">I morgen</string>
<string name="today">I dag</string>
<string name="yesterday">I går</string>
<!-- Rx -->
<string name="connecting_for">Opretter forbindelse i %1$d s</string>
<string name="handshaking">Forbindelse verificeres</string>
<string name="connected">Tilsuttet</string>
<string name="disconnecting">Afbryder</string>
<string name="waiting_for_disconnection">Venter på afbrydelse</string>
<!-- Custom Watchface -->
<string name="metadata_label_watchface_created_at">Oprettet den: %1$s</string>
<string name="metadata_label_watchface_author">Forfatter: %1$s</string>
<string name="metadata_label_watchface_name">Navn: %1$s</string>
<string name="metadata_wear_import_filename">Filnavn: %1$s</string>
<string name="metadata_label_plugin_version">Plugin version: %1$s</string>
<string name="metadata_label_watchface_name_version">Navn: %1$s (%2$s)</string>
<string name="metadata_label_watchface_infos">Oplysning: %1$s</string>
<string name="pref_show_iob">Vis IOB</string>
<string name="pref_show_detailed_iob">Vis detaljeret IOB</string>
<string name="pref_show_cob">Vis COB</string>
<string name="pref_show_delta">Vis Delta</string>
<string name="pref_show_detailed_delta">Vis detaljeret Delta</string>
<string name="pref_show_avgdelta">Show GnsDelta</string>
<string name="pref_show_phone_battery">Vis Telefonbatteri</string>
<string name="pref_show_rig_battery">Vis Rig-batteri</string>
<string name="pref_show_basal_rate">Vis Basalrate</string>
<string name="pref_show_loop_status">Vis Loop-status</string>
<string name="pref_show_bg">Vis BS</string>
<string name="pref_show_bgi">Vis BSI</string>
<string name="pref_show_direction_arrow">Vis Retningspil</string>
<string name="pref_show_ago">Vis alder</string>
<string name="default_custom_watchface_comment">Standard urskive, du kan klikke på EKSPORTÉR URSKIVE-knappen for at generere en skabelon</string>
<string name="wear_default_watchface">Standard Urskive</string>
<string name="cwf_comment_background">Baggrundsbillede</string>
<string name="cwf_comment_chart">Grafer (BS, basal, prognoselinjer...)</string>
<string name="cwf_comment_cover_chart">Billede foran graf og bag tekstfelter</string>
<string name="cwf_comment_freetext1">Fritekst 1</string>
<string name="cwf_comment_freetext2">Fri tekst 2</string>
<string name="cwf_comment_freetext3">Fri tekst 3</string>
<string name="cwf_comment_freetext4">Fri tekst 4</string>
<string name="cwf_comment_iob1">IOB-etiket eller IOB-sum, hvis givet</string>
<string name="cwf_comment_iob2">IOB-sum eller (Bolus_IOB|Basal_IOB) hvis givet</string>
<string name="cwf_comment_cob1">COB-etiket</string>
<string name="cwf_comment_cob2">COB-værdi</string>
<string name="cwf_comment_delta">Kort BG-delta</string>
<string name="cwf_comment_avg_delta">Gennemsnitlig BG-delta (15min)</string>
<string name="cwf_comment_uploader_battery">Telefonbatteri (%)</string>
<string name="cwf_comment_rig_battery">Globalt loop batteri (%)</string>
<string name="cwf_comment_basalRate">Basalrate</string>
<string name="cwf_comment_bgi">BGI-værdi</string>
<string name="cwf_comment_time">Tid (TT:MM eller TT:MM:SS)</string>
<string name="cwf_comment_hour">Time (TT)</string>
<string name="cwf_comment_minute">Minut (MM)</string>
<string name="cwf_comment_second">Sekund (SS)</string>
<string name="cwf_comment_timePeriod">AM eller PM</string>
<string name="cwf_comment_day_name">Navn på ugedag</string>
<string name="cwf_comment_day">Dag (DD)</string>
<string name="cwf_comment_month">Måned navn (kort)</string>
<string name="cwf_comment_loop">Loop status og tid</string>
<string name="cwf_comment_direction">Retningspil</string>
<string name="cwf_comment_timestamp">Minutter siden sidst modtaget BS</string>
<string name="cwf_comment_sgv">BS-værdi</string>
<string name="cwf_comment_cover_plate">Dækbillede foran tekst (opkald...)</string>
<string name="cwf_comment_hour_hand">Billede af timeviser (Analogur)</string>
<string name="cwf_comment_minute_hand">Billede af minutviser (Analogur)</string>
<string name="cwf_comment_second_hand">Billede af sekundviser (Analogur)</string>
</resources>

View file

@ -1,92 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- DateUtil-->
<string name="minago">vor %1$d Min.</string>
<string name="minago_long">vor %1$d Minuten</string>
<string name="hoursago">vor %1$.1f Stunde</string>
<string name="days_ago">vor %1$.1f Tagen</string>
<string name="days_ago_round">vor %1$.0f Tagen</string>
<string name="in_days">in %1$.0f Tagen</string>
<string name="in_days_round">in %1$.0f Tagen</string>
<string name="shorthour">h</string>
<string name="days">Tage</string>
<string name="hours">Stunden</string>
<string name="unit_second">Sekunde</string>
<string name="unit_minute">Minute</string>
<string name="unit_hour">Stunde</string>
<string name="unit_day">Tag</string>
<string name="unit_week">Woche</string>
<string name="unit_seconds">Sekunden</string>
<string name="unit_minutes">Minuten</string>
<string name="unit_hours">Stunden</string>
<string name="unit_days">Tage</string>
<string name="unit_weeks">Wochen</string>
<string name="shortminute">m</string>
<string name="shortday">d</string>
<string name="later_today">Später heute</string>
<string name="tomorrow">Morgen</string>
<string name="today">Heute</string>
<string name="yesterday">Gestern</string>
<!-- Rx -->
<string name="connecting_for">Verbindungsaufbau seit %1$d s</string>
<string name="handshaking">Handshaking</string>
<string name="connected">Verbunden</string>
<string name="disconnecting">Verbindung wird getrennt</string>
<string name="waiting_for_disconnection">Warte auf Trennung der Verbindung</string>
<!-- Custom Watchface -->
<string name="metadata_label_watchface_created_at">Erstellt am: %1$s</string>
<string name="metadata_label_watchface_author">Autor: %1$s</string>
<string name="metadata_label_watchface_name">Name: %1$s</string>
<string name="metadata_wear_import_filename">Dateiname: %1$s</string>
<string name="metadata_label_plugin_version">Plugin-Version: %1$s</string>
<string name="metadata_label_watchface_name_version">Name: %1$s (%2$s)</string>
<string name="pref_show_iob">IOB anzeigen</string>
<string name="pref_show_detailed_iob">Zeige detailliertes IOB</string>
<string name="pref_show_cob">COB anzeigen</string>
<string name="pref_show_delta">Abweichung anzeigen</string>
<string name="pref_show_detailed_delta">Zeige detailliertes Delta</string>
<string name="pref_show_avgdelta">Durchschnittl. Abweichung anzeigen</string>
<string name="pref_show_phone_battery">Akkustand Smartphone</string>
<string name="pref_show_rig_battery">Akkustand Rig</string>
<string name="pref_show_basal_rate">Basalrate anzeigen</string>
<string name="pref_show_loop_status">Loop Status anzeigen</string>
<string name="pref_show_bg">BZ anzeigen</string>
<string name="pref_show_bgi">Zeige BGI</string>
<string name="pref_show_direction_arrow">Trendpfeil anzeigen</string>
<string name="pref_show_ago">Min. seit letztem Wert</string>
<string name="default_custom_watchface_comment">Standard-Watchface, Du kannst auf den Knopf WATCHFACE exportieren drücken, um eine Vorlage zu generieren</string>
<string name="wear_default_watchface">Standard-Watchface</string>
<string name="cwf_comment_background">Hintergrundbild</string>
<string name="cwf_comment_chart">Diagramme (BG, Basal, Vorhersage...)</string>
<string name="cwf_comment_cover_chart">Bild vor Graph und hinter Textfeldern</string>
<string name="cwf_comment_freetext1">Freitextfeld 1</string>
<string name="cwf_comment_freetext2">Freitextfeld 2</string>
<string name="cwf_comment_freetext3">Freitextfeld 3</string>
<string name="cwf_comment_freetext4">Freitextfeld 4</string>
<string name="cwf_comment_iob1">IOB Bezeichnung oder IOB Sum wenn detailliert</string>
<string name="cwf_comment_iob2">IOB-Summe oder (Bolus_IOB|Basal_IOB) wenn detailliert</string>
<string name="cwf_comment_cob1">COB-Bezeichnung</string>
<string name="cwf_comment_cob2">COB-Wert</string>
<string name="cwf_comment_delta">Kurzes BG Delta</string>
<string name="cwf_comment_avg_delta">Durchschnittliches BG-Delta (15min)</string>
<string name="cwf_comment_uploader_battery">Telefon-Akku (%)</string>
<string name="cwf_comment_rig_battery">Globale Loop Akku (%)</string>
<string name="cwf_comment_basalRate">Basalrate</string>
<string name="cwf_comment_bgi">BGI-Wert</string>
<string name="cwf_comment_time">Uhrzeit (HH:MM oder HH:MM:SS)</string>
<string name="cwf_comment_hour">Stunde (HH)</string>
<string name="cwf_comment_minute">Minuten (MM)</string>
<string name="cwf_comment_second">Sekunde (SS)</string>
<string name="cwf_comment_timePeriod">AM oder PM</string>
<string name="cwf_comment_day_name">Wochentagname</string>
<string name="cwf_comment_day">Tag (DD)</string>
<string name="cwf_comment_month">Monatsname (kurz)</string>
<string name="cwf_comment_loop">Loop-Status und Historie</string>
<string name="cwf_comment_direction">Richtungspfeil</string>
<string name="cwf_comment_timestamp">Minuten vor dem letzten erhaltenen BG</string>
<string name="cwf_comment_sgv">Blutzuckerwert</string>
<string name="cwf_comment_cover_plate">Titelbild vor dem Text (wählen...)</string>
<string name="cwf_comment_hour_hand">Bild des Stundenzeiger (Analog Uhr)</string>
<string name="cwf_comment_minute_hand">Bild des Minutenzeiger (Analog Uhr)</string>
<string name="cwf_comment_second_hand">Bild des Sekundenzeigers (Analog Uhr)</string>
</resources>

View file

@ -1,93 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- DateUtil-->
<string name="minago">%1$d λ πριν</string>
<string name="minago_long">%1$d λεπτά πριν</string>
<string name="hoursago">%1$.1f ω πριν</string>
<string name="days_ago">%1$.1f ημέρες πριν</string>
<string name="days_ago_round">%1$.0f ημέρες πριν</string>
<string name="in_days">σε %1$.0f ημέρες</string>
<string name="in_days_round">σε %1$.0f ημέρες</string>
<string name="shorthour">h</string>
<string name="days">ημέρες</string>
<string name="hours">ώρες</string>
<string name="unit_second">δευτερόλεπτο</string>
<string name="unit_minute">λεπτό</string>
<string name="unit_hour">ώρα</string>
<string name="unit_day">ημέρα</string>
<string name="unit_week">εβδομάδα</string>
<string name="unit_seconds">δευτερόλεπτα</string>
<string name="unit_minutes">λεπτά</string>
<string name="unit_hours">ώρες</string>
<string name="unit_days">ημέρες</string>
<string name="unit_weeks">εβδομάδες</string>
<string name="shortminute">m</string>
<string name="shortday">ημ</string>
<string name="later_today">Αργότερα σήμερα</string>
<string name="tomorrow">Αύριο</string>
<string name="today">Σήμερα</string>
<string name="yesterday">Χθες</string>
<!-- Rx -->
<string name="connecting_for">Σύνδεση για %1$d δευτερόλεπτα</string>
<string name="handshaking">Δημιουργία σύνδεσης</string>
<string name="connected">Συνδέθηκε</string>
<string name="disconnecting">Αποσυνδέεται</string>
<string name="waiting_for_disconnection">Αναμονή για αποσύνδεση</string>
<!-- Custom Watchface -->
<string name="metadata_label_watchface_created_at">Δημιουργήθηκε: %1$s</string>
<string name="metadata_label_watchface_author">Συντάκτης: %1$s</string>
<string name="metadata_label_watchface_name">Όνομα: %1$s</string>
<string name="metadata_wear_import_filename">Όνομα αρχείου: %1$s</string>
<string name="metadata_label_plugin_version">Έκδοση πρόσθετου: %1$s</string>
<string name="metadata_label_watchface_name_version">Όνομα: %1$s (%2$s)</string>
<string name="metadata_label_watchface_infos">Πληροφορίες: %1$s</string>
<string name="pref_show_iob">Εμφάνιση IOB</string>
<string name="pref_show_detailed_iob">Εμφάνιση λεπτομερούς IOB</string>
<string name="pref_show_cob">Εμφάνιση COB</string>
<string name="pref_show_delta">Εμφάνιση Διαφοράς</string>
<string name="pref_show_detailed_delta">Εμφάνιση λεπτομερούς Διαφοράς</string>
<string name="pref_show_avgdelta">Εμφάνιση Μέσης Διαφοράς</string>
<string name="pref_show_phone_battery">Εμφάνιση Μπαταρίας Τηλεφώνου</string>
<string name="pref_show_rig_battery">Εμφάνιση Μπαταρίας Rig</string>
<string name="pref_show_basal_rate">Εμφάνιση Βασικού Ρυθμού</string>
<string name="pref_show_loop_status">Εμφάνιση Κατάστασης Κυκλώματος</string>
<string name="pref_show_bg">Εμφάνιση γλυκόζης αίματος</string>
<string name="pref_show_bgi">Εμφάνιση BGI</string>
<string name="pref_show_direction_arrow">Εμφάνιση Βέλους Κατεύθυνσης</string>
<string name="pref_show_ago">Εμφάνιση Πριν</string>
<string name="default_custom_watchface_comment">Προεπιλεγμένη πρόσοψη ρολογιού, μπορείτε να κάνετε κλικ στο κουμπί ΕΞΑΓΩΓΗ ΠΡΟΣΟΨΗΣ για να δημιουργήσετε ένα πρότυπο</string>
<string name="wear_default_watchface">Προεπιλεγμένη πρόσοψη ρολογιού</string>
<string name="cwf_comment_background">Εικόνα φόντου</string>
<string name="cwf_comment_chart">Γραφήματα (BG, βασικός, γραμμές πρόβλεψης...)</string>
<string name="cwf_comment_cover_chart">Εικόνα μπροστά από το γράφημα και πίσω από τα πεδία κειμένου</string>
<string name="cwf_comment_freetext1">Ελεύθερο κείμενο 1</string>
<string name="cwf_comment_freetext2">Ελεύθερο κείμενο 2</string>
<string name="cwf_comment_freetext3">Ελεύθερο κείμενο 3</string>
<string name="cwf_comment_freetext4">Ελεύθερο κείμενο 4</string>
<string name="cwf_comment_iob1">Ετικέτα IOB ή Άθροισμα IOB εάν είναι λεπτομερές</string>
<string name="cwf_comment_iob2">Άθροισμα IOB ή (Bolus_IOB|Basal_IOB) εάν είναι λεπτομερές</string>
<string name="cwf_comment_cob1">Ετικέτα COB</string>
<string name="cwf_comment_cob2">Τιμή COB</string>
<string name="cwf_comment_delta">Βραχυπρόθεσμη διαφορά BG</string>
<string name="cwf_comment_avg_delta">Μέση διαφορά BG (15λεπτά)</string>
<string name="cwf_comment_uploader_battery">Μπαταρία τηλεφώνου (%)</string>
<string name="cwf_comment_rig_battery">Μπαταρία συνολικού κυκλώματος (%)</string>
<string name="cwf_comment_basalRate">Βασικός Ρυθμός</string>
<string name="cwf_comment_bgi">Τιμή BGI</string>
<string name="cwf_comment_time">Ώρα (ΩΩ:ΛΛ ή ΩΩ:ΜΜ:ΣΣ)</string>
<string name="cwf_comment_hour">Ώρα (HH)</string>
<string name="cwf_comment_minute">Λεπτό (MM)</string>
<string name="cwf_comment_second">Δευτερόλεπτο (SS)</string>
<string name="cwf_comment_timePeriod">ΠΜ ή ΜΜ</string>
<string name="cwf_comment_day_name">Όνομα της ημέρας της εβδομάδας</string>
<string name="cwf_comment_day">Ημέρα (DD)</string>
<string name="cwf_comment_month">Όνομα μήνα (σύντομο)</string>
<string name="cwf_comment_loop">Κατάσταση κυκλώματος και πριν</string>
<string name="cwf_comment_direction">Βέλος κατεύθυνσης</string>
<string name="cwf_comment_timestamp">Λεπτά πριν από την τελευταία λήψη BG</string>
<string name="cwf_comment_sgv">Τιμή γλυκόζης αίματος</string>
<string name="cwf_comment_cover_plate">Εικόνα εξωφύλλου μπροστά από το κείμενο (κλήσεις...)</string>
<string name="cwf_comment_hour_hand">Εικόνα ώρας χεριού (Αναλογικό ρολόι)</string>
<string name="cwf_comment_minute_hand">Εικόνα λεπτού χεριού (Αναλογικό ρολόι)</string>
<string name="cwf_comment_second_hand">Εικόνα δευτερολέπτου χεριού (Αναλογικό ρολόι)</string>
</resources>

View file

@ -1,93 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- DateUtil-->
<string name="minago">hace %1$d m</string>
<string name="minago_long">Hace %1$d minutos</string>
<string name="hoursago">hace %1$.1f h</string>
<string name="days_ago">Hace %1$.1f día</string>
<string name="days_ago_round">Hace %1$.0f días</string>
<string name="in_days">en %1$.0f días</string>
<string name="in_days_round">en %1$.0f días</string>
<string name="shorthour">h</string>
<string name="days">días</string>
<string name="hours">horas</string>
<string name="unit_second">segundo</string>
<string name="unit_minute">minuto</string>
<string name="unit_hour">hora</string>
<string name="unit_day">día</string>
<string name="unit_week">semana</string>
<string name="unit_seconds">segundos</string>
<string name="unit_minutes">minutos</string>
<string name="unit_hours">horas</string>
<string name="unit_days">días</string>
<string name="unit_weeks">semanas</string>
<string name="shortminute">m</string>
<string name="shortday">d</string>
<string name="later_today">Más tarde hoy</string>
<string name="tomorrow">Mañana</string>
<string name="today">Hoy</string>
<string name="yesterday">Ayer</string>
<!-- Rx -->
<string name="connecting_for">Conectando durante %1$d s</string>
<string name="handshaking">Estableciendo comunicación</string>
<string name="connected">Conectado</string>
<string name="disconnecting">Desconectando</string>
<string name="waiting_for_disconnection">Esperando la desconexión</string>
<!-- Custom Watchface -->
<string name="metadata_label_watchface_created_at">Creada: %1$s</string>
<string name="metadata_label_watchface_author">Autor: %1$s</string>
<string name="metadata_label_watchface_name">Nombre: %1$s</string>
<string name="metadata_wear_import_filename">Nombre del archivo: %1$s</string>
<string name="metadata_label_plugin_version">Versión del plugin: %1$s</string>
<string name="metadata_label_watchface_name_version">Nombre: %1$s (%2$s)</string>
<string name="metadata_label_watchface_infos">Info: %1$s</string>
<string name="pref_show_iob">Mostrar IOB</string>
<string name="pref_show_detailed_iob">Mostrar IOB detallada</string>
<string name="pref_show_cob">Mostrar COB</string>
<string name="pref_show_delta">Mostrar delta</string>
<string name="pref_show_detailed_delta">Mostrar delta detallado</string>
<string name="pref_show_avgdelta">Mostrar delta promedio</string>
<string name="pref_show_phone_battery">Mostrar batería del teléfono</string>
<string name="pref_show_rig_battery">Mostrar batería global del lazo</string>
<string name="pref_show_basal_rate">Mostrar la tasa basal</string>
<string name="pref_show_loop_status">Mostrar estado del lazo</string>
<string name="pref_show_bg">Mostrar glucosa</string>
<string name="pref_show_bgi">Mostrar BGI (Índice de glucosa en sangre)</string>
<string name="pref_show_direction_arrow">Mostrar flecha de dirección</string>
<string name="pref_show_ago">Mostrar \"hace\"</string>
<string name="default_custom_watchface_comment">Esfera predeterminada, puedes hacer clic en el botón EXPORTAR ESFERA para generar una plantilla</string>
<string name="wear_default_watchface">Esfera por defecto</string>
<string name="cwf_comment_background">Imagen de fondo</string>
<string name="cwf_comment_chart">Gráficos (glucosa, basal, líneas de predicción...)</string>
<string name="cwf_comment_cover_chart">Imagen frente al gráfico y detrás de campos de texto</string>
<string name="cwf_comment_freetext1">Texto libre 1</string>
<string name="cwf_comment_freetext2">Texto libre 2</string>
<string name="cwf_comment_freetext3">Texto libre 3</string>
<string name="cwf_comment_freetext4">Texto libre 4</string>
<string name="cwf_comment_iob1">Etiqueta IOB o Suma IOB si es detallada</string>
<string name="cwf_comment_iob2">Suma de IOB o (Bolos_IOB|Basal_IOB) si se detalla</string>
<string name="cwf_comment_cob1">Etiqueta COB</string>
<string name="cwf_comment_cob2">Valor COB</string>
<string name="cwf_comment_delta">Delta corto de glucosa</string>
<string name="cwf_comment_avg_delta">Delta promedio de glucosa (15min)</string>
<string name="cwf_comment_uploader_battery">Batería del teléfono (%)</string>
<string name="cwf_comment_rig_battery">Batería global de lazo (%)</string>
<string name="cwf_comment_basalRate">Tasa Basal</string>
<string name="cwf_comment_bgi">Valor BGI</string>
<string name="cwf_comment_time">Tiempo (HH:MM o HH:MM:SS)</string>
<string name="cwf_comment_hour">Hora (HH)</string>
<string name="cwf_comment_minute">Minuto (MM)</string>
<string name="cwf_comment_second">Segundo (SS)</string>
<string name="cwf_comment_timePeriod">AM o PM</string>
<string name="cwf_comment_day_name">Nombre del día de la semana</string>
<string name="cwf_comment_day">Día (DD)</string>
<string name="cwf_comment_month">Nombre del mes (corto)</string>
<string name="cwf_comment_loop">Estado del bucle y hace</string>
<string name="cwf_comment_direction">Flecha de dirección</string>
<string name="cwf_comment_timestamp">Minutos atrás del último valor de glucosa recibido</string>
<string name="cwf_comment_sgv">Valor de glucosa</string>
<string name="cwf_comment_cover_plate">Imagen de portada delante del texto (diales...)</string>
<string name="cwf_comment_hour_hand">Imagen de la aguja horaria (reloj analógico)</string>
<string name="cwf_comment_minute_hand">Imagen del minutero (reloj analógico)</string>
<string name="cwf_comment_second_hand">Imagen del segundero (reloj analógico)</string>
</resources>

View file

@ -1,93 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- DateUtil-->
<string name="minago">il y a %1$d m</string>
<string name="minago_long">Il y a %1$d minutes</string>
<string name="hoursago">il y a %1$.1f h</string>
<string name="days_ago">Il y a %1$.1f jours</string>
<string name="days_ago_round">Il y a %1$.0f jours</string>
<string name="in_days">en %1$.0f jours</string>
<string name="in_days_round">en %1$.0f jours</string>
<string name="shorthour">h</string>
<string name="days">jours</string>
<string name="hours">heures</string>
<string name="unit_second">seconde</string>
<string name="unit_minute">minute</string>
<string name="unit_hour">heure</string>
<string name="unit_day">jour</string>
<string name="unit_week">semaine</string>
<string name="unit_seconds">secondes</string>
<string name="unit_minutes">minutes</string>
<string name="unit_hours">heures</string>
<string name="unit_days">jours</string>
<string name="unit_weeks">semaines</string>
<string name="shortminute">m</string>
<string name="shortday">j</string>
<string name="later_today">Plus tard aujourd\'hui</string>
<string name="tomorrow">Demain</string>
<string name="today">Aujourdhui</string>
<string name="yesterday">Hier</string>
<!-- Rx -->
<string name="connecting_for">Connexion en cours %1$ds</string>
<string name="handshaking">Connexion</string>
<string name="connected">Connectée</string>
<string name="disconnecting">Déconnexion en cours</string>
<string name="waiting_for_disconnection">Attente de déconnexion</string>
<!-- Custom Watchface -->
<string name="metadata_label_watchface_created_at">Créé le : %1$s</string>
<string name="metadata_label_watchface_author">Auteur : %1$s</string>
<string name="metadata_label_watchface_name">Nom : %1$s</string>
<string name="metadata_wear_import_filename">Nom du fichier : %1$s</string>
<string name="metadata_label_plugin_version">Version du plugin : %1$s</string>
<string name="metadata_label_watchface_name_version">Nom : %1$s (%2$s)</string>
<string name="metadata_label_watchface_infos">Infos : %1$s</string>
<string name="pref_show_iob">Afficher IA</string>
<string name="pref_show_detailed_iob">Afficher IA détaillée</string>
<string name="pref_show_cob">Afficher GA</string>
<string name="pref_show_delta">Montrer le delta</string>
<string name="pref_show_detailed_delta">Afficher Delta Détaillé</string>
<string name="pref_show_avgdelta">Afficher le delta moyen</string>
<string name="pref_show_phone_battery">Afficher la batterie du téléphone</string>
<string name="pref_show_rig_battery">Afficher la batterie de la plateforme </string>
<string name="pref_show_basal_rate">Afficher Basale</string>
<string name="pref_show_loop_status">Afficher État Boucle</string>
<string name="pref_show_bg">Afficher Glycémie</string>
<string name="pref_show_bgi">Afficher IGly</string>
<string name="pref_show_direction_arrow">Afficher Flèche</string>
<string name="pref_show_ago">Afficher Min Passées</string>
<string name="default_custom_watchface_comment">Cadran par défaut, vous pouvez cliquer sur le bouton EXPORTER WATCHFACE pour générer un modèle</string>
<string name="wear_default_watchface">Cadran par défaut</string>
<string name="cwf_comment_background">Image d\'arrière-plan</string>
<string name="cwf_comment_chart">Graphiques (Gly, basal, lignes de prédiction...)</string>
<string name="cwf_comment_cover_chart">Image devant le graphique et derrière les champs de texte</string>
<string name="cwf_comment_freetext1">Texte libre 1</string>
<string name="cwf_comment_freetext2">Texte libre 2</string>
<string name="cwf_comment_freetext3">Texte libre 3</string>
<string name="cwf_comment_freetext4">Texte libre 4</string>
<string name="cwf_comment_iob1">Libellé \"IA\" ou valeur IA globale si détaillé Ok</string>
<string name="cwf_comment_iob2">Valeur IA globale ou (IA_Bolus|IA_Basal) si détaillé Ok</string>
<string name="cwf_comment_cob1">Libellé \"GA\"</string>
<string name="cwf_comment_cob2">Valeur de GA</string>
<string name="cwf_comment_delta">Delta Glycémie (5min)</string>
<string name="cwf_comment_avg_delta">Delta glycémie moyen (15min)</string>
<string name="cwf_comment_uploader_battery">Batterie du téléphone (%)</string>
<string name="cwf_comment_rig_battery">Batterie de la boucle globale (%)</string>
<string name="cwf_comment_basalRate">Débit Basal</string>
<string name="cwf_comment_bgi">Valeur de IGly</string>
<string name="cwf_comment_time">Heure (HH:MM ou HH:MM:SS)</string>
<string name="cwf_comment_hour">Heure (HH)</string>
<string name="cwf_comment_minute">Minute (MM)</string>
<string name="cwf_comment_second">Seconde (SS)</string>
<string name="cwf_comment_timePeriod">AM ou PM</string>
<string name="cwf_comment_day_name">Nom du jour de la semaine</string>
<string name="cwf_comment_day">Jour (JJ)</string>
<string name="cwf_comment_month">Nom du mois (court)</string>
<string name="cwf_comment_loop">État de la boucle et délais</string>
<string name="cwf_comment_direction">Flèche de direction</string>
<string name="cwf_comment_timestamp">Minutes depuis la dernière Glycémie reçue</string>
<string name="cwf_comment_sgv">Valeur de Ia Gly</string>
<string name="cwf_comment_cover_plate">Image de couverture devant le texte (cadrans...)</string>
<string name="cwf_comment_hour_hand">Image de l\'aiģuille de l\'heure (Montre Analogique)</string>
<string name="cwf_comment_minute_hand">Image de l\'aiguille des minutes (Montre Analogique)</string>
<string name="cwf_comment_second_hand">Image de l\'aiguille des secondes (Montre Analogique)</string>
</resources>

View file

@ -1,26 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- DateUtil-->
<string name="minago">%1$d nóim ó shin</string>
<string name="hoursago">%1$.1f u ó shin</string>
<string name="shorthour">u</string>
<string name="days"></string>
<string name="hours">uair</string>
<string name="unit_second">soicind</string>
<string name="unit_minute">nóiméad</string>
<string name="unit_hour">uair</string>
<string name="unit_day"></string>
<string name="unit_week">seachtain</string>
<string name="unit_seconds">soicind</string>
<string name="unit_minutes">nóiméad</string>
<string name="unit_hours">uair</string>
<string name="unit_days"></string>
<string name="unit_weeks">seachtaine</string>
<string name="shortminute">n</string>
<string name="shortday"></string>
<!-- Rx -->
<string name="connecting_for">Ag nascadh le %1$d s</string>
<string name="connected">Nasctha</string>
<string name="disconnecting">Dícheangal</string>
<!-- Custom Watchface -->
</resources>

View file

@ -1,14 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- DateUtil-->
<string name="days_ago">Prije %1$.1f dana</string>
<string name="days_ago_round">Prije %1$.0f dana</string>
<string name="today">Danas</string>
<!-- Rx -->
<string name="connecting_for">Povezivanje %1$d s</string>
<string name="handshaking">Povezivanje</string>
<string name="connected">Povezano</string>
<string name="disconnecting">Odspajanje</string>
<string name="waiting_for_disconnection">Čeka se prekid veze</string>
<!-- Custom Watchface -->
</resources>

View file

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- DateUtil-->
<string name="shortminute">p</string>
<string name="shortday">n</string>
<!-- Rx -->
<string name="connected">Kapcsolódva</string>
<!-- Custom Watchface -->
</resources>

View file

@ -1,93 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- DateUtil-->
<string name="minago">%1$d m fa</string>
<string name="minago_long">%1$d minuti fa</string>
<string name="hoursago">%1$.1f h fa</string>
<string name="days_ago">%1$.1f giorni fa</string>
<string name="days_ago_round">%1$.0f giorni fa</string>
<string name="in_days">in %1$.0f giorni</string>
<string name="in_days_round">in %1$.0f giorni</string>
<string name="shorthour">h</string>
<string name="days">giorni</string>
<string name="hours">ore</string>
<string name="unit_second">secondi</string>
<string name="unit_minute">minuti</string>
<string name="unit_hour">ora</string>
<string name="unit_day">giorno</string>
<string name="unit_week">settimana</string>
<string name="unit_seconds">secondi</string>
<string name="unit_minutes">minuti</string>
<string name="unit_hours">ore</string>
<string name="unit_days">giorni</string>
<string name="unit_weeks">settimane</string>
<string name="shortminute">m</string>
<string name="shortday">d</string>
<string name="later_today">Più tardì oggi</string>
<string name="tomorrow">Domani</string>
<string name="today">Oggi</string>
<string name="yesterday">Ieri</string>
<!-- Rx -->
<string name="connecting_for">In connessione per %1$d s</string>
<string name="handshaking">Connessione</string>
<string name="connected">Connesso</string>
<string name="disconnecting">Disconnessione</string>
<string name="waiting_for_disconnection">In attesa della disconnessione</string>
<!-- Custom Watchface -->
<string name="metadata_label_watchface_created_at">Creato: %1$s</string>
<string name="metadata_label_watchface_author">Autore: %1$s</string>
<string name="metadata_label_watchface_name">Nome: %1$s</string>
<string name="metadata_wear_import_filename">Nome file: %1$s</string>
<string name="metadata_label_plugin_version">Versione plugin: %1$s</string>
<string name="metadata_label_watchface_name_version">Nome: %1$s (%2$s)</string>
<string name="metadata_label_watchface_infos">Info: %1$s</string>
<string name="pref_show_iob">Mostra IOB</string>
<string name="pref_show_detailed_iob">Mostra IOB dettagliato</string>
<string name="pref_show_cob">Mostra COB</string>
<string name="pref_show_delta">Mostra delta</string>
<string name="pref_show_detailed_delta">Mostra delta dettagliato</string>
<string name="pref_show_avgdelta">Mostra delta medio</string>
<string name="pref_show_phone_battery">Mostra batteria telefono</string>
<string name="pref_show_rig_battery">Mostra batteria rig</string>
<string name="pref_show_basal_rate">Mostra velocità basale</string>
<string name="pref_show_loop_status">Mostra stato loop</string>
<string name="pref_show_bg">Mostra BG</string>
<string name="pref_show_bgi">Mostra BGI</string>
<string name="pref_show_direction_arrow">Mostra frecce direzionali</string>
<string name="pref_show_ago">Mostra Indietro</string>
<string name="default_custom_watchface_comment">Watchface predefinita, puoi fare click sul tasto ESPORTA WATCHFACE per generare un template</string>
<string name="wear_default_watchface">Watchface predefinita</string>
<string name="cwf_comment_background">Immagine sfondo</string>
<string name="cwf_comment_chart">Grafici (BG, basale, linee di previsione...)</string>
<string name="cwf_comment_cover_chart">Immagine davanti al grafico e dietro i campi di testo</string>
<string name="cwf_comment_freetext1">Testo libero 1</string>
<string name="cwf_comment_freetext2">Testo libero 2</string>
<string name="cwf_comment_freetext3">Testo libero 3</string>
<string name="cwf_comment_freetext4">Testo libero 4</string>
<string name="cwf_comment_iob1">Etichetta IOB o somma IOB se in dettaglio</string>
<string name="cwf_comment_iob2">Somma IOB o (Bolo_IOB|Basale_IOB) se in dettaglio</string>
<string name="cwf_comment_cob1">Etichetta COB</string>
<string name="cwf_comment_cob2">Valore COB</string>
<string name="cwf_comment_delta">Delta BG breve</string>
<string name="cwf_comment_avg_delta">Delta BG medio (15min)</string>
<string name="cwf_comment_uploader_battery">Batteria telefono (%)</string>
<string name="cwf_comment_rig_battery">Batteria globale loop (%)</string>
<string name="cwf_comment_basalRate">Velocità basale</string>
<string name="cwf_comment_bgi">Valore BGI</string>
<string name="cwf_comment_time">Tempo (HH:MM o HH:MM:SS)</string>
<string name="cwf_comment_hour">Ora (HH)</string>
<string name="cwf_comment_minute">Minuto (MM)</string>
<string name="cwf_comment_second">Secondo (SS)</string>
<string name="cwf_comment_timePeriod">AM o PM</string>
<string name="cwf_comment_day_name">Nome del giorno della settimana</string>
<string name="cwf_comment_day">Giorno (DD)</string>
<string name="cwf_comment_month">Nome del mese (breve)</string>
<string name="cwf_comment_loop">Stato loop e indietro</string>
<string name="cwf_comment_direction">Freccia direzionale</string>
<string name="cwf_comment_timestamp">Minuti addietro per l\'ultimo valore BG ricevuto</string>
<string name="cwf_comment_sgv">Valore BG</string>
<string name="cwf_comment_cover_plate">Immagine di copertina davanti al testo (quadranti...)</string>
<string name="cwf_comment_hour_hand">Immagine lancetta ore (orologio analogico)</string>
<string name="cwf_comment_minute_hand">Immagine lancetta minuti (orologio analogico)</string>
<string name="cwf_comment_second_hand">Immagine lancetta secondi (orologio analogico)</string>
</resources>

View file

@ -1,54 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- DateUtil-->
<string name="minago">לפני %1$d דקות</string>
<string name="minago_long">לפני %1$d דקות</string>
<string name="hoursago">לפני %1$.1f שעות</string>
<string name="days_ago">לפני %1$.1f ימים</string>
<string name="days_ago_round">לפני %1$.0f ימים</string>
<string name="in_days">בעוד %1$.0f ימים</string>
<string name="in_days_round">בעוד %1$.0f ימים</string>
<string name="shorthour">ש\'</string>
<string name="days">ימים</string>
<string name="hours">שעות</string>
<string name="unit_second">שניה</string>
<string name="unit_minute">דקה</string>
<string name="unit_hour">שעה</string>
<string name="unit_day">יום</string>
<string name="unit_week">שבוע</string>
<string name="unit_seconds">שניות</string>
<string name="unit_minutes">דקות</string>
<string name="unit_hours">שעות</string>
<string name="unit_days">ימים</string>
<string name="unit_weeks">שבועות</string>
<string name="shortminute">דק\'</string>
<string name="shortday">י\'</string>
<string name="later_today">מאוחר יותר היום</string>
<string name="tomorrow">מחר</string>
<string name="today">היום</string>
<string name="yesterday">אתמול</string>
<!-- Rx -->
<string name="connecting_for">חיבור אל %1$s</string>
<string name="handshaking">לוחץ יד</string>
<string name="connected">מחובר</string>
<string name="disconnecting">מתנתק</string>
<string name="waiting_for_disconnection">ממתין לניתוק</string>
<!-- Custom Watchface -->
<string name="metadata_label_watchface_created_at">נוצר ב: %1$s</string>
<string name="metadata_label_watchface_author">יוצר/ת: %1$s</string>
<string name="metadata_label_watchface_name">שם: %1$s</string>
<string name="metadata_wear_import_filename">שם קובץ: %1$s</string>
<string name="metadata_label_plugin_version">גרסת פלאגין: %1$s</string>
<string name="metadata_label_watchface_name_version">שם: %1$s (%2$s)</string>
<string name="pref_show_iob">הצג אינסולין פעיל</string>
<string name="pref_show_detailed_iob">הצגת אינס\' פעיל מפורט</string>
<string name="pref_show_cob">הצג פח\' פעילות</string>
<string name="pref_show_delta">הצג דלתא</string>
<string name="pref_show_detailed_delta">הצג דלתא מפורטת</string>
<string name="pref_show_avgdelta">הצג דלתא ממוצעת</string>
<string name="pref_show_phone_battery">הצג את סוללת הטלפון</string>
<string name="pref_show_rig_battery">הצג סוללת ריג</string>
<string name="pref_show_basal_rate">הצג מינון בזאלי</string>
<string name="default_custom_watchface_comment">ברירת המחדל של פני השעון, ניתן ללחוץ על כפתור ייצוא פני שעון כדי ליצור תבנית</string>
<string name="wear_default_watchface">ברירת מחדל פני שעון</string>
</resources>

View file

@ -1,37 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- DateUtil-->
<string name="minago">%1$d 分前</string>
<string name="minago_long">%1$d 分前</string>
<string name="hoursago">%1$.1f 時間前</string>
<string name="days_ago">%1$.1f 日前</string>
<string name="days_ago_round">%1$.0f 日前</string>
<string name="in_days">in %1$.0f 日</string>
<string name="in_days_round">in %1$.0f 日</string>
<string name="shorthour"></string>
<string name="days">日間</string>
<string name="hours">時間</string>
<string name="unit_second"></string>
<string name="unit_minute"></string>
<string name="unit_hour"></string>
<string name="unit_day"></string>
<string name="unit_week"></string>
<string name="unit_seconds"></string>
<string name="unit_minutes"></string>
<string name="unit_hours">時間</string>
<string name="unit_days"></string>
<string name="unit_weeks">週間</string>
<string name="shortminute"></string>
<string name="shortday"></string>
<string name="later_today">今日中</string>
<string name="tomorrow">明日</string>
<string name="today">今日</string>
<string name="yesterday">昨日</string>
<!-- Rx -->
<string name="connecting_for">%1$d 秒間接続中</string>
<string name="handshaking">ハンドシェイク中です</string>
<string name="connected">接続されました</string>
<string name="disconnecting">切断中</string>
<string name="waiting_for_disconnection">切断待ち</string>
<!-- Custom Watchface -->
</resources>

View file

@ -1,92 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- DateUtil-->
<string name="minago">%1$d 분 전</string>
<string name="minago_long">%1$d분 전</string>
<string name="hoursago">%1$.1f 시간 전</string>
<string name="days_ago">%1$.1f일 전</string>
<string name="days_ago_round">%1$.0f 일 전</string>
<string name="in_days">%1$.0f 일 이내에</string>
<string name="in_days_round">%1$.0f 일 이내에</string>
<string name="shorthour">시간</string>
<string name="days"></string>
<string name="hours">시간</string>
<string name="unit_second"></string>
<string name="unit_minute"></string>
<string name="unit_hour"></string>
<string name="unit_day"></string>
<string name="unit_week"></string>
<string name="unit_seconds"></string>
<string name="unit_minutes"></string>
<string name="unit_hours"></string>
<string name="unit_days"></string>
<string name="unit_weeks"></string>
<string name="shortminute"></string>
<string name="shortday"></string>
<string name="later_today">오늘 늦게</string>
<string name="tomorrow">내일</string>
<string name="today">오늘</string>
<string name="yesterday">어제</string>
<!-- Rx -->
<string name="connecting_for">%1$d 초 동안 연결중</string>
<string name="handshaking">통신 확인</string>
<string name="connected">연결됨</string>
<string name="disconnecting">연결끊기중</string>
<string name="waiting_for_disconnection">연결 해제 대기 중</string>
<!-- Custom Watchface -->
<string name="metadata_label_watchface_created_at">생성 시간: %1$s</string>
<string name="metadata_label_watchface_author">작성자: %1$s</string>
<string name="metadata_label_watchface_name">이름: %1$s</string>
<string name="metadata_wear_import_filename">파일 이름: %1$s</string>
<string name="metadata_label_plugin_version">플러그인 버전: %1$s</string>
<string name="metadata_label_watchface_name_version">이름: %1$s (%2$s)</string>
<string name="pref_show_iob">IOB 표시</string>
<string name="pref_show_detailed_iob">IOB 자세한 표시</string>
<string name="pref_show_cob">COB 표시</string>
<string name="pref_show_delta">델타 표시하기</string>
<string name="pref_show_detailed_delta">자세한 델타 표시하기</string>
<string name="pref_show_avgdelta">평균 델타 표시하기</string>
<string name="pref_show_phone_battery">핸드폰 배터리 표시하기</string>
<string name="pref_show_rig_battery">리그 베터리 표시하기</string>
<string name="pref_show_basal_rate">Basal 값 표시하기</string>
<string name="pref_show_loop_status">루프 상태 표시하기</string>
<string name="pref_show_bg">BG 표시하기</string>
<string name="pref_show_bgi">BGI 표시하기</string>
<string name="pref_show_direction_arrow">화살표 표시하기</string>
<string name="pref_show_ago">이전 표시하기</string>
<string name="default_custom_watchface_comment">기본 시계, 워치페이스 내보내기 버튼을 클릭하여 템플릿을 생성할 수 있습니다.</string>
<string name="wear_default_watchface">기본 워치페이스</string>
<string name="cwf_comment_background">배경화면 이미지</string>
<string name="cwf_comment_chart">그래픽 (혈당, basal, 예측 선...)</string>
<string name="cwf_comment_cover_chart">그래프 앞 그리고 문자 필드 뒤 이미지</string>
<string name="cwf_comment_freetext1">무료 문자 1</string>
<string name="cwf_comment_freetext2">무료 문자 2</string>
<string name="cwf_comment_freetext3">무료 문자 3</string>
<string name="cwf_comment_freetext4">무료 문자 4</string>
<string name="cwf_comment_iob1">자세한 경우 IOB 레이블 또는 IOB 합계</string>
<string name="cwf_comment_iob2">자세한 경우 IOB 합계 또는 (Bolus_IOB|Basal_IOB)</string>
<string name="cwf_comment_cob1">COB 레이블</string>
<string name="cwf_comment_cob2">COB 값</string>
<string name="cwf_comment_delta">단기 BG 델타</string>
<string name="cwf_comment_avg_delta">평균 BG 델타 (15분)</string>
<string name="cwf_comment_uploader_battery">핸드폰 베터리 (%)</string>
<string name="cwf_comment_rig_battery">글로벌 루프 베터리 (%)</string>
<string name="cwf_comment_basalRate">Basal양</string>
<string name="cwf_comment_bgi">BGI 값</string>
<string name="cwf_comment_time">시간 (HH:MM 또는 HH:MM:SS)</string>
<string name="cwf_comment_hour">시간 (HH)</string>
<string name="cwf_comment_minute">분 (MM)</string>
<string name="cwf_comment_second">초 (SS)</string>
<string name="cwf_comment_timePeriod">오전 또는 오후</string>
<string name="cwf_comment_day_name">요일</string>
<string name="cwf_comment_day">일 (DD)</string>
<string name="cwf_comment_month">월명 (짧게)</string>
<string name="cwf_comment_loop">루프 상태 및 이전</string>
<string name="cwf_comment_direction">방향 화살표</string>
<string name="cwf_comment_timestamp">몇 분 전에 마지막으로 받은 BG</string>
<string name="cwf_comment_sgv">BG 값</string>
<string name="cwf_comment_cover_plate">문자 앞의 표지 이미지 (다이얼...)</string>
<string name="cwf_comment_hour_hand">시침 이미지 (아날로그 시계)</string>
<string name="cwf_comment_minute_hand">분침 이미지 (아날로그 시계)</string>
<string name="cwf_comment_second_hand">초침 이미지 (아날로그 시계)</string>
</resources>

View file

@ -1,93 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- DateUtil-->
<string name="minago">prieš %1$d min.</string>
<string name="minago_long">Prieš %1$d min.</string>
<string name="hoursago">Prieš %1$.1f val.</string>
<string name="days_ago">Prieš %1$s d.</string>
<string name="days_ago_round">Prieš %1$.0f d.</string>
<string name="in_days">Po %1$.0f d.</string>
<string name="in_days_round">Po %1$.0f d.</string>
<string name="shorthour">val.</string>
<string name="days">d.</string>
<string name="hours">val.</string>
<string name="unit_second">sek.</string>
<string name="unit_minute">min.</string>
<string name="unit_hour">val.</string>
<string name="unit_day">d.</string>
<string name="unit_week">sav.</string>
<string name="unit_seconds">sekundės</string>
<string name="unit_minutes"> min.</string>
<string name="unit_hours">val.</string>
<string name="unit_days">d.</string>
<string name="unit_weeks">savaičių</string>
<string name="shortminute">m</string>
<string name="shortday">d</string>
<string name="later_today">Šiandien vėliau</string>
<string name="tomorrow">Rytoj</string>
<string name="today">Šiandien</string>
<string name="yesterday">Vakar</string>
<!-- Rx -->
<string name="connecting_for">Jungiamasi %1$d s</string>
<string name="handshaking">Ryšio užmezgimas</string>
<string name="connected">Prisijungta</string>
<string name="disconnecting">Atsijungiama</string>
<string name="waiting_for_disconnection">Laukiama atsijungimo</string>
<!-- Custom Watchface -->
<string name="metadata_label_watchface_created_at">Sukurta: %1$s</string>
<string name="metadata_label_watchface_author">Autorius: %1$s</string>
<string name="metadata_label_watchface_name">Vardas: %1$s</string>
<string name="metadata_wear_import_filename">Failo pavadinimas: %1$s</string>
<string name="metadata_label_plugin_version">Įskiepio versija: %1$s</string>
<string name="metadata_label_watchface_name_version">Pavadinimas: %1$s (%2$s)</string>
<string name="metadata_label_watchface_infos">Info: %1$s</string>
<string name="pref_show_iob">Rodyti AIO</string>
<string name="pref_show_detailed_iob">Rodyti detalų AIO</string>
<string name="pref_show_cob">Rodyti AAO</string>
<string name="pref_show_delta">Rodyti pokytį</string>
<string name="pref_show_detailed_delta">Rodyti glikemijos pokyčius detaliai</string>
<string name="pref_show_avgdelta">Rodyti vidutinį pokytį</string>
<string name="pref_show_phone_battery">Rodyti telefono bateriją</string>
<string name="pref_show_rig_battery">Rodyti įrenginio bateriją</string>
<string name="pref_show_basal_rate">Rodyti valandinę bazę</string>
<string name="pref_show_loop_status">Rodyti Ciklo statusą</string>
<string name="pref_show_bg">Rodyti KG</string>
<string name="pref_show_bgi">Rodyti GĮ</string>
<string name="pref_show_direction_arrow">Rodyti krypties rodyklę</string>
<string name="pref_show_ago">Laikas nuo pask. vertės</string>
<string name="default_custom_watchface_comment">Numatytasis ekranas. Paspaudus EKSPORTUOTI, bus sukurtas ruošinys</string>
<string name="wear_default_watchface">Numatytasis ekranas</string>
<string name="cwf_comment_background">Fono paveiksliukas</string>
<string name="cwf_comment_chart">Grafikai (glikemija, bazė, prognozės...)</string>
<string name="cwf_comment_cover_chart">Paveiksliukas už teksto ir prieš grafiką</string>
<string name="cwf_comment_freetext1">Laisvas tekstas 1</string>
<string name="cwf_comment_freetext2">Laisvas tekstas 2</string>
<string name="cwf_comment_freetext3">Laisvas tekstas 3</string>
<string name="cwf_comment_freetext4">Laisvas tekstas 4</string>
<string name="cwf_comment_iob1">Sudėtinis arba detalus AIO</string>
<string name="cwf_comment_iob2">Sudėtinis arba detalus (Boluso_AIO|Bazės_AIO) AIO</string>
<string name="cwf_comment_cob1">AAO žyma</string>
<string name="cwf_comment_cob2">AAO vertė</string>
<string name="cwf_comment_delta">Trumpo laikotarpio pokytis</string>
<string name="cwf_comment_avg_delta">Vidutinis pokytis (15 min)</string>
<string name="cwf_comment_uploader_battery">Telefono baterija (%)</string>
<string name="cwf_comment_rig_battery">Baterija (%)</string>
<string name="cwf_comment_basalRate">Bazė</string>
<string name="cwf_comment_bgi">KGI vertė</string>
<string name="cwf_comment_time">Laikas (val:min arba val:min:sek)</string>
<string name="cwf_comment_hour">Val.</string>
<string name="cwf_comment_minute">Min.</string>
<string name="cwf_comment_second">Sek.</string>
<string name="cwf_comment_timePeriod">AM ar PM</string>
<string name="cwf_comment_day_name">Savaitės diena</string>
<string name="cwf_comment_day">Diena (d.)</string>
<string name="cwf_comment_month">Mėnuo (sutrump.)</string>
<string name="cwf_comment_loop">Ciklo būsena</string>
<string name="cwf_comment_direction">Tendencijos rodyklė</string>
<string name="cwf_comment_timestamp">Prieš kiek minučių nuskaityta glikemija</string>
<string name="cwf_comment_sgv">Glikemija</string>
<string name="cwf_comment_cover_plate">Paveiksliukas prieš tekstą (skambučius...)</string>
<string name="cwf_comment_hour_hand">Analoginio laikrodžio valandinė rodyklė</string>
<string name="cwf_comment_minute_hand">Analoginio laikrodžio minutinė rodyklė</string>
<string name="cwf_comment_second_hand">Analoginio laikrodžio sekundinė rodyklė</string>
</resources>

View file

@ -1,93 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- DateUtil-->
<string name="minago">%1$d m geleden</string>
<string name="minago_long">%1$d minuten geleden</string>
<string name="hoursago">%1$.1f uur geleden</string>
<string name="days_ago">%1$.1f dagen geleden</string>
<string name="days_ago_round">%1$.0f dagen geleden</string>
<string name="in_days">over %1$.0f dagen</string>
<string name="in_days_round">binnen %1$.0f dagen</string>
<string name="shorthour">u</string>
<string name="days">dagen</string>
<string name="hours">uren</string>
<string name="unit_second">seconde</string>
<string name="unit_minute">minuut</string>
<string name="unit_hour">uur</string>
<string name="unit_day">dag</string>
<string name="unit_week">week</string>
<string name="unit_seconds">seconden</string>
<string name="unit_minutes">minuten</string>
<string name="unit_hours">uren</string>
<string name="unit_days">dagen</string>
<string name="unit_weeks">weken</string>
<string name="shortminute">m</string>
<string name="shortday">d</string>
<string name="later_today">Later vandaag</string>
<string name="tomorrow">Morgen</string>
<string name="today">Vandaag</string>
<string name="yesterday">Gisteren</string>
<!-- Rx -->
<string name="connecting_for">Verbonden gedurende %1$d s</string>
<string name="handshaking">Handshaking</string>
<string name="connected">Verbonden</string>
<string name="disconnecting">Verbinding aan het verbreken</string>
<string name="waiting_for_disconnection">Wachten op het loskoppelen</string>
<!-- Custom Watchface -->
<string name="metadata_label_watchface_created_at">Gemaakt op: %1$s</string>
<string name="metadata_label_watchface_author">Auteur: %1$s</string>
<string name="metadata_label_watchface_name">Naam: %1$s</string>
<string name="metadata_wear_import_filename">Bestandsnaam: %1$s</string>
<string name="metadata_label_plugin_version">Plugin versie: %1$s</string>
<string name="metadata_label_watchface_name_version">Naam: %1$s (%2$s)</string>
<string name="metadata_label_watchface_infos">Info: %1$s</string>
<string name="pref_show_iob">Toon IOB</string>
<string name="pref_show_detailed_iob">Toon gedetailleerde IOB</string>
<string name="pref_show_cob">Toon COB</string>
<string name="pref_show_delta">Toon Delta</string>
<string name="pref_show_detailed_delta">Toon gedetailleerde Delta</string>
<string name="pref_show_avgdelta">Toon gemiddelde delta</string>
<string name="pref_show_phone_battery">Toon Telefoon Batterij</string>
<string name="pref_show_rig_battery">Toon Rig batterij</string>
<string name="pref_show_basal_rate">Toon basaalstand</string>
<string name="pref_show_loop_status">Toon Loop Status</string>
<string name="pref_show_bg">Toon BG</string>
<string name="pref_show_bgi">Toon BGI</string>
<string name="pref_show_direction_arrow">Toon richtingspijl</string>
<string name="pref_show_ago">Toon tijd geleden</string>
<string name="default_custom_watchface_comment">Standaard watchface, u kunt op de EXPORT WATCHFACE knop klikken om een sjabloon te genereren</string>
<string name="wear_default_watchface">Standaard watchface</string>
<string name="cwf_comment_background">Achtergrondafbeelding</string>
<string name="cwf_comment_chart">Grafieken (BG, basaal, voorspellingslijnen...)</string>
<string name="cwf_comment_cover_chart">Afbeelding voor de grafiek en achter tekstvelden</string>
<string name="cwf_comment_freetext1">Vrije tekst 1</string>
<string name="cwf_comment_freetext2">Vrije tekst 2</string>
<string name="cwf_comment_freetext3">Vrije tekst 3</string>
<string name="cwf_comment_freetext4">Vrije tekst 4</string>
<string name="cwf_comment_iob1">IOB label of IOB totaal indien gedetailleerd</string>
<string name="cwf_comment_iob2">IOB totaal of (Bolus_IOB|Basal_IOB) indien gedetailleerd</string>
<string name="cwf_comment_cob1">COB label</string>
<string name="cwf_comment_cob2">COB waarde</string>
<string name="cwf_comment_delta">Korte BG delta</string>
<string name="cwf_comment_avg_delta">Gemiddelde BG delta (15min)</string>
<string name="cwf_comment_uploader_battery">Batterij Telefoon (%)</string>
<string name="cwf_comment_rig_battery">Globale loop batterij (%)</string>
<string name="cwf_comment_basalRate">Basaal stand</string>
<string name="cwf_comment_bgi">BGI waarde</string>
<string name="cwf_comment_time">Tijd (UU:MM of UU:MM:SS)</string>
<string name="cwf_comment_hour">Uur (UU)</string>
<string name="cwf_comment_minute">Minuut (MM)</string>
<string name="cwf_comment_second">Seconde (SS)</string>
<string name="cwf_comment_timePeriod">AM of PM</string>
<string name="cwf_comment_day_name">Naam van de dag van de week</string>
<string name="cwf_comment_day">Dag (DD)</string>
<string name="cwf_comment_month">Maand (kort)</string>
<string name="cwf_comment_loop">Loop status en tijd geleden</string>
<string name="cwf_comment_direction">Richtingspijl</string>
<string name="cwf_comment_timestamp">Minuten geleden voor laatst ontvangen BG</string>
<string name="cwf_comment_sgv">BG waarde</string>
<string name="cwf_comment_cover_plate">Masker afbeelding over tekst (bijv. uren indicators)</string>
<string name="cwf_comment_hour_hand">Afbeelding van uren wijzer (analoog horloge)</string>
<string name="cwf_comment_minute_hand">Afbeelding van minuut wijzer (analoog horloge)</string>
<string name="cwf_comment_second_hand">Afbeelding van seconde wijzer (analoog horloge)</string>
</resources>

View file

@ -1,93 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- DateUtil-->
<string name="minago">%1$d min siden</string>
<string name="minago_long">%1$d minutter siden</string>
<string name="hoursago">%1$.1f timer siden</string>
<string name="days_ago">%1$.1f dager siden</string>
<string name="days_ago_round">%1$.0f dager siden</string>
<string name="in_days">om %1$.0f dager</string>
<string name="in_days_round">om %1$.0f dager</string>
<string name="shorthour">t</string>
<string name="days">dager</string>
<string name="hours">timer</string>
<string name="unit_second">sekund</string>
<string name="unit_minute">minutt</string>
<string name="unit_hour">time</string>
<string name="unit_day">dag</string>
<string name="unit_week">uke</string>
<string name="unit_seconds">sekunder</string>
<string name="unit_minutes">minutter</string>
<string name="unit_hours">timer</string>
<string name="unit_days">dager</string>
<string name="unit_weeks">uker</string>
<string name="shortminute">m</string>
<string name="shortday">d</string>
<string name="later_today">Senere i dag</string>
<string name="tomorrow">I morgen</string>
<string name="today">Idag</string>
<string name="yesterday">I går</string>
<!-- Rx -->
<string name="connecting_for">Tilkobler i %1$d sek</string>
<string name="handshaking">Tilkobling verifiseres</string>
<string name="connected">Tilkoblet</string>
<string name="disconnecting">Frakobler</string>
<string name="waiting_for_disconnection">Venter på frakobling</string>
<!-- Custom Watchface -->
<string name="metadata_label_watchface_created_at">Opprettet: %1$s</string>
<string name="metadata_label_watchface_author">Laget av: %1$s</string>
<string name="metadata_label_watchface_name">Navn: %1$s</string>
<string name="metadata_wear_import_filename">Filnavn: %1$s</string>
<string name="metadata_label_plugin_version">Plugin-versjon: %1$s</string>
<string name="metadata_label_watchface_name_version">Navn: %1$s (%2$s)</string>
<string name="metadata_label_watchface_infos">Info: %1$s</string>
<string name="pref_show_iob">Vis IOB</string>
<string name="pref_show_detailed_iob">Vis detaljert IOB</string>
<string name="pref_show_cob">Vis COB</string>
<string name="pref_show_delta">Vis Delta</string>
<string name="pref_show_detailed_delta">Vis detaljert Delta</string>
<string name="pref_show_avgdelta">Vis Gj. snitt Delta</string>
<string name="pref_show_phone_battery">Vis telefonbatteri</string>
<string name="pref_show_rig_battery">Vis riggens batteri</string>
<string name="pref_show_basal_rate">Vis basalrate</string>
<string name="pref_show_loop_status">Vis loop status</string>
<string name="pref_show_bg">Vis BS</string>
<string name="pref_show_bgi">Vis BS</string>
<string name="pref_show_direction_arrow">Vis retningspil</string>
<string name="pref_show_ago">Vis tid siden</string>
<string name="default_custom_watchface_comment">Standard klokkebakgrunn, du kan klikke på EKSPORTER KLOKKEBAKGRUNN for å lage en mal</string>
<string name="wear_default_watchface">Standard klokkebakgrunn</string>
<string name="cwf_comment_background">Bakgrunnsbilde</string>
<string name="cwf_comment_chart">Grafer (BS, basal, prediksjonslinjer...)</string>
<string name="cwf_comment_cover_chart">Bilde foran grafer og bak tekstfelter</string>
<string name="cwf_comment_freetext1">Fritekst 1</string>
<string name="cwf_comment_freetext2">Fritekst 2</string>
<string name="cwf_comment_freetext3">Fritekst 3</string>
<string name="cwf_comment_freetext4">Fritekst 4</string>
<string name="cwf_comment_iob1">IOB-merkelapp eller IOB-sum hvis angitt</string>
<string name="cwf_comment_iob2">IOB-sum eller (Bolus_IOB|Basal_IOB) hvis angitt</string>
<string name="cwf_comment_cob1">COB etikett</string>
<string name="cwf_comment_cob2">COB verdi</string>
<string name="cwf_comment_delta">Kort BS-endring</string>
<string name="cwf_comment_avg_delta">Gj.snitt BS-endring (15min)</string>
<string name="cwf_comment_uploader_battery">Telefonbatteri (%)</string>
<string name="cwf_comment_rig_battery">Rig-batteri (%)</string>
<string name="cwf_comment_basalRate">Basalrate</string>
<string name="cwf_comment_bgi">BGI verdi</string>
<string name="cwf_comment_time">Tid (TT:MM eller TT:MM:SS)</string>
<string name="cwf_comment_hour">Time (TT)</string>
<string name="cwf_comment_minute">Minutt (MM)</string>
<string name="cwf_comment_second">Sekund (SS)</string>
<string name="cwf_comment_timePeriod">AM eller PM</string>
<string name="cwf_comment_day_name">Navn på ukedag</string>
<string name="cwf_comment_day">Dag (DD)</string>
<string name="cwf_comment_month">Navn på måned (kort)</string>
<string name="cwf_comment_loop">Loop-status og tid siden</string>
<string name="cwf_comment_direction">Retningspil</string>
<string name="cwf_comment_timestamp">Minutter siden BS sist ble mottatt</string>
<string name="cwf_comment_sgv">BS-verdi</string>
<string name="cwf_comment_cover_plate">Bilde foran tekst (urvisere...)</string>
<string name="cwf_comment_hour_hand">Bilde av timeviser (analog klokke)</string>
<string name="cwf_comment_minute_hand">Bilde av minuttviser (analog klokke)</string>
<string name="cwf_comment_second_hand">Bilde av sekundviser (analog klokke)</string>
</resources>

View file

@ -1,93 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- DateUtil-->
<string name="minago">%1$d min temu</string>
<string name="minago_long">%1$d minut temu</string>
<string name="hoursago">%1$.1f godz. temu</string>
<string name="days_ago">%1$.1f dni temu</string>
<string name="days_ago_round">%1$.0f dni temu</string>
<string name="in_days">za %1$.0f dni</string>
<string name="in_days_round">za %1$.0f dni</string>
<string name="shorthour">h</string>
<string name="days">dni</string>
<string name="hours">godzin</string>
<string name="unit_second">sekunda</string>
<string name="unit_minute">minuta</string>
<string name="unit_hour">godzina</string>
<string name="unit_day">dzień</string>
<string name="unit_week">tydzień</string>
<string name="unit_seconds">sekund</string>
<string name="unit_minutes">minut</string>
<string name="unit_hours">godzin</string>
<string name="unit_days">dni</string>
<string name="unit_weeks">tygodni</string>
<string name="shortminute">m</string>
<string name="shortday">d</string>
<string name="later_today">Dzisiaj, później</string>
<string name="tomorrow">Jutro</string>
<string name="today">Dziś</string>
<string name="yesterday">Wczoraj</string>
<!-- Rx -->
<string name="connecting_for">Łączenie przez %1$d s</string>
<string name="handshaking">Nawiązywanie połączenia</string>
<string name="connected">Połączono</string>
<string name="disconnecting">Rozłączanie</string>
<string name="waiting_for_disconnection">Oczekiwanie na rozłączenie</string>
<!-- Custom Watchface -->
<string name="metadata_label_watchface_created_at">Utworzono: %1$s</string>
<string name="metadata_label_watchface_author">Autor: %1$s</string>
<string name="metadata_label_watchface_name">Nazwa: %1$s</string>
<string name="metadata_wear_import_filename">Nazwa pliku: %1$s</string>
<string name="metadata_label_plugin_version">Wersja wtyczki: %1$s</string>
<string name="metadata_label_watchface_name_version">Nazwa: %1$s (%2$s)</string>
<string name="metadata_label_watchface_infos">Info: %1$s</string>
<string name="pref_show_iob">Pokaż IOB</string>
<string name="pref_show_detailed_iob">Pokaż szczegółowe IOB</string>
<string name="pref_show_cob">Pokaż COB</string>
<string name="pref_show_delta">Pokaż Deltę</string>
<string name="pref_show_detailed_delta">Pokaż szczegółowo Deltę</string>
<string name="pref_show_avgdelta">Pokaż Śr. Deltę</string>
<string name="pref_show_phone_battery">Pokaż Baterię Telefonu</string>
<string name="pref_show_rig_battery">Pokaż Baterię Zestawu</string>
<string name="pref_show_basal_rate">Pokaż Dawkę Bazową</string>
<string name="pref_show_loop_status">Pokaż Status Pętli</string>
<string name="pref_show_bg">Pokaż glikemię</string>
<string name="pref_show_bgi">Pokaż BGI</string>
<string name="pref_show_direction_arrow">Pokaż Strzałkę Trendu</string>
<string name="pref_show_ago">Pokaż Aktualność</string>
<string name="default_custom_watchface_comment">Domyślna tarcza, możesz kliknąć na EXPORTUJ TARCZĘ aby wygenerować szablon</string>
<string name="wear_default_watchface">Domyślna Tarcza</string>
<string name="cwf_comment_background">Obraz w tle</string>
<string name="cwf_comment_chart">Wykresy (glikemia, baza, prognozy...)</string>
<string name="cwf_comment_cover_chart">Obraz przed wykresem i za polami tekstowymi</string>
<string name="cwf_comment_freetext1">Wolne pole tekstowe 1</string>
<string name="cwf_comment_freetext2">Wolne pole tekstowe 2</string>
<string name="cwf_comment_freetext3">Wolne pole tekstowe 3</string>
<string name="cwf_comment_freetext4">Wolne pole tekstowe 4</string>
<string name="cwf_comment_iob1">Etykieta IOB lub suma IOB przy szczegółowym IOB</string>
<string name="cwf_comment_iob2">Suma IOB lub (Bolus_IOB|Basal_IOB) jeśli szczegółowo</string>
<string name="cwf_comment_cob1">Etykieta COB</string>
<string name="cwf_comment_cob2">Wartość COB</string>
<string name="cwf_comment_delta">Krótka delta glikemii</string>
<string name="cwf_comment_avg_delta">Średnia delta glikemii (15min)</string>
<string name="cwf_comment_uploader_battery">Bateria telefonu (%)</string>
<string name="cwf_comment_rig_battery">Globalna bateria pętli (%)</string>
<string name="cwf_comment_basalRate">Wartości bazy</string>
<string name="cwf_comment_bgi">Wartość BGI</string>
<string name="cwf_comment_time">Czas (HH:MM or HH:MM:SS)</string>
<string name="cwf_comment_hour">Godzina (HH)</string>
<string name="cwf_comment_minute">Minuta (MM)</string>
<string name="cwf_comment_second">Sekunda (SS)</string>
<string name="cwf_comment_timePeriod">AM lub PM</string>
<string name="cwf_comment_day_name">Nazwa dnia tygodnia</string>
<string name="cwf_comment_day">Dzień (DD)</string>
<string name="cwf_comment_month">Nazwa miesiąca (krótka)</string>
<string name="cwf_comment_loop">Status pętli i aktualność</string>
<string name="cwf_comment_direction">Strzałka trendu</string>
<string name="cwf_comment_timestamp">Minut od ostatniego otrzymania glikemii</string>
<string name="cwf_comment_sgv">Wartość glikemii</string>
<string name="cwf_comment_cover_plate">Obraz nakładki przed tekstem (tarcze...)</string>
<string name="cwf_comment_hour_hand">Obraz lub wskazówka godzinowa (Tarcza Analogowa)</string>
<string name="cwf_comment_minute_hand">Obraz lub wskazówka minutowa (Tarcza Analogowa)</string>
<string name="cwf_comment_second_hand">Obraz lub wskazówka sekundowa (Tarcza Analogowa)</string>
</resources>

View file

@ -1,60 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- DateUtil-->
<string name="minago">%1$d min atrás</string>
<string name="minago_long">%1$d minutos atrás</string>
<string name="hoursago">%1$.1fh atrás</string>
<string name="days_ago">%1$d dias atrás</string>
<string name="days_ago_round">%1$.0f dias atrás</string>
<string name="in_days">em %1$.0f dias</string>
<string name="in_days_round">em %1$.0f dias</string>
<string name="shorthour">h</string>
<string name="days">dias</string>
<string name="hours">horas</string>
<string name="unit_second">segundo</string>
<string name="unit_minute">minuto</string>
<string name="unit_hour">hora</string>
<string name="unit_day">dia</string>
<string name="unit_week">semana</string>
<string name="unit_seconds">segundos</string>
<string name="unit_minutes">minutos</string>
<string name="unit_hours">horas</string>
<string name="unit_days">dias</string>
<string name="unit_weeks">semanas</string>
<string name="shortminute">m</string>
<string name="shortday">d</string>
<string name="later_today">Hoje, Mais tarde</string>
<string name="tomorrow">Amanhã</string>
<string name="today">Hoje</string>
<string name="yesterday">Ontem</string>
<!-- Rx -->
<string name="connecting_for">Conectando para %1$d</string>
<string name="handshaking">Cumprimento</string>
<string name="connected">Conectado</string>
<string name="disconnecting">A desligar</string>
<string name="waiting_for_disconnection">Aguardando a desconexão</string>
<!-- Custom Watchface -->
<string name="metadata_label_watchface_created_at">Criado por %1$s</string>
<string name="metadata_label_watchface_author">Autor: %1$s</string>
<string name="metadata_label_watchface_name">Nome: %1$s</string>
<string name="metadata_wear_import_filename">Nome do arquivo: %1$s</string>
<string name="metadata_label_plugin_version">Versão do plugin: %1$s</string>
<string name="metadata_label_watchface_name_version">Nome: %1$s (%2$s)</string>
<string name="metadata_label_watchface_infos">Informações: %1$s</string>
<string name="pref_show_iob">Mostrar IA</string>
<string name="pref_show_detailed_iob">Mostrar detalhes da IA</string>
<string name="pref_show_cob">Mostrar CA</string>
<string name="pref_show_delta">Mostrar Delta</string>
<string name="pref_show_detailed_delta">Mostrar Delta detalho</string>
<string name="pref_show_avgdelta">Mostrar média de delta</string>
<string name="pref_show_phone_battery">Mostrar bateria do telefone</string>
<string name="pref_show_rig_battery">Mostrar bateria de rig</string>
<string name="pref_show_basal_rate">Mostrar Taxa Basal</string>
<string name="pref_show_loop_status">Mostrar Status do Loop</string>
<string name="pref_show_bg">Mostrar glicemia</string>
<string name="pref_show_bgi">Mostrar BGI</string>
<string name="pref_show_direction_arrow">Mostrar seta de tendência</string>
<string name="pref_show_ago">Exibir atrás</string>
<string name="default_custom_watchface_comment">Watchface padrão, você pode clicar no botão EXPORTAR WATCHFACE para gerar um modelo</string>
<string name="wear_default_watchface">Watchface padrão</string>
</resources>

View file

@ -1,91 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- DateUtil-->
<string name="minago">%1$d m atrás</string>
<string name="minago_long">%%1$d minutos atrás</string>
<string name="hoursago">%1$.1f h atrás</string>
<string name="days_ago">%1$.1f dias atrás</string>
<string name="days_ago_round">%1$.0f dias atrás</string>
<string name="in_days">em %1$.0f dias</string>
<string name="in_days_round">em %1$.0f dias</string>
<string name="shorthour">h</string>
<string name="days">dias</string>
<string name="hours">horas</string>
<string name="unit_second">segundo</string>
<string name="unit_minute">minuto</string>
<string name="unit_hour">hora</string>
<string name="unit_day">dia</string>
<string name="unit_week">semana</string>
<string name="unit_seconds">segundos</string>
<string name="unit_minutes">minutos</string>
<string name="unit_hours">horas</string>
<string name="unit_days">dias</string>
<string name="unit_weeks">semanas</string>
<string name="shortminute">m</string>
<string name="shortday">d</string>
<string name="later_today">Hoje mais tarde</string>
<string name="tomorrow">Amanhã</string>
<string name="today">Hoje</string>
<string name="yesterday">Ontem</string>
<!-- Rx -->
<string name="connecting_for">A ligar durante %1$d s</string>
<string name="handshaking">Cumprimento</string>
<string name="connected">Ligado</string>
<string name="disconnecting">A desconectar</string>
<string name="waiting_for_disconnection">A aguardar a desconexão</string>
<!-- Custom Watchface -->
<string name="metadata_label_watchface_created_at">Criado em: %1$s</string>
<string name="metadata_label_watchface_author">Autor: %1$s</string>
<string name="metadata_label_watchface_name">Nome: %1$s</string>
<string name="metadata_wear_import_filename">Nome do ficheiro: %1$s</string>
<string name="metadata_label_plugin_version">Versão do plugin: %1$s</string>
<string name="metadata_label_watchface_name_version">Nome: %1$s (%2$s)</string>
<string name="pref_show_iob">Mostrar IA</string>
<string name="pref_show_detailed_iob">Mostrar IA detalhada</string>
<string name="pref_show_cob">Mostrar HCA</string>
<string name="pref_show_delta">Mostrar Delta</string>
<string name="pref_show_detailed_delta">Mostrar Delta detalhado</string>
<string name="pref_show_avgdelta">Mostrar Delta Médio</string>
<string name="pref_show_phone_battery">Mostrar Bateria Telefone</string>
<string name="pref_show_rig_battery">Mostrar Bateria Equipamento</string>
<string name="pref_show_basal_rate">Mostrar Taxa Basal</string>
<string name="pref_show_loop_status">Mostrar Estado Loop</string>
<string name="pref_show_bg">Mostrar glicemia</string>
<string name="pref_show_bgi">Mostrar IG</string>
<string name="pref_show_direction_arrow">Mostrar Seta Direcção</string>
<string name="pref_show_ago">Mostrar Atrás</string>
<string name="default_custom_watchface_comment">Watchface padrão, pode clicar no botão EXPORTAR WATCHFACE para gerar um modelo</string>
<string name="wear_default_watchface">Watchface padrão</string>
<string name="cwf_comment_background">Imagem de fundo</string>
<string name="cwf_comment_chart">Gráficos (GLIC, basal, linhas de previsão...)</string>
<string name="cwf_comment_cover_chart">Imagem na frente do gráfico e atrás dos campos de texto</string>
<string name="cwf_comment_freetext1">Texto livre 1</string>
<string name="cwf_comment_freetext2">Texto livre 2</string>
<string name="cwf_comment_freetext3">Texto livre 3</string>
<string name="cwf_comment_freetext4">Texto livre 4</string>
<string name="cwf_comment_iob1">Etiqueta de IA ou Soma IA se detalhada</string>
<string name="cwf_comment_iob2">Soma IA ou (Bolus_IA|Basal_IA) se detalhada</string>
<string name="cwf_comment_cob1">Etiqueta HCA</string>
<string name="cwf_comment_cob2">valor HCA</string>
<string name="cwf_comment_delta">Delta curto da glicemia</string>
<string name="cwf_comment_avg_delta">Delta da glicemia média (15min)</string>
<string name="cwf_comment_uploader_battery">Bateria do telefone (%)</string>
<string name="cwf_comment_rig_battery">Bateria do loop (%)</string>
<string name="cwf_comment_basalRate">Taxa Basal</string>
<string name="cwf_comment_bgi">Valor de IG</string>
<string name="cwf_comment_time">Horário (HH:MM ou HH:MM:SS)</string>
<string name="cwf_comment_hour">Hora (HH)</string>
<string name="cwf_comment_minute">Minuto (MM)</string>
<string name="cwf_comment_second">Segundo (SS)</string>
<string name="cwf_comment_timePeriod">AM ou PM</string>
<string name="cwf_comment_day_name">Nome do Dia da Semana</string>
<string name="cwf_comment_day">Dia (DD)</string>
<string name="cwf_comment_month">Nome do Mês (curto)</string>
<string name="cwf_comment_direction">Seta de direção</string>
<string name="cwf_comment_timestamp">Minutos desde a recepção do último valor de GLIC</string>
<string name="cwf_comment_sgv">Valor de GLIC</string>
<string name="cwf_comment_cover_plate">Imagem da capa na frente do texto</string>
<string name="cwf_comment_hour_hand">Imagem do ponteiro das horas (Relógio Analógico)</string>
<string name="cwf_comment_minute_hand">Imagem do ponteiro dos minutos (Relógio Analógico)</string>
<string name="cwf_comment_second_hand">Imagem do ponteiro dos segundos (Relógio Analógico)</string>
</resources>

View file

@ -1,28 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- DateUtil-->
<string name="minago">%1$d min în urmă</string>
<string name="hoursago">%1$.1f ore în urmă</string>
<string name="shorthour">h</string>
<string name="days">zile</string>
<string name="hours">ore</string>
<string name="unit_second">secundă</string>
<string name="unit_minute">minut</string>
<string name="unit_hour">oră</string>
<string name="unit_day">zi</string>
<string name="unit_week">săptămână</string>
<string name="unit_seconds">secunde</string>
<string name="unit_minutes">minute</string>
<string name="unit_hours">ore</string>
<string name="unit_days">zile</string>
<string name="unit_weeks">săptămâni</string>
<string name="shortminute">m</string>
<string name="shortday">z</string>
<!-- Rx -->
<string name="connecting_for">Conectat de %1$d s</string>
<string name="handshaking">Împerechere</string>
<string name="connected">Conectat</string>
<string name="disconnecting">Se deconectează</string>
<string name="waiting_for_disconnection">Se așteaptă deconectarea</string>
<!-- Custom Watchface -->
</resources>

View file

@ -1,38 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- DateUtil-->
<string name="minago">%1$d мин. назад</string>
<string name="minago_long">%1$d минут назад</string>
<string name="hoursago">%1$.1fч. назад</string>
<string name="days_ago">%1$s дн назад</string>
<string name="days_ago_round">%1$s дн назад</string>
<string name="in_days">через %1$.0f дн</string>
<string name="in_days_round">через %1$.0f дн</string>
<string name="shorthour">ч</string>
<string name="days">дн</string>
<string name="hours">час</string>
<string name="unit_second">сек</string>
<string name="unit_minute">мин</string>
<string name="unit_hour">час</string>
<string name="unit_day">дн</string>
<string name="unit_week">нед</string>
<string name="unit_seconds">сек</string>
<string name="unit_minutes">мин</string>
<string name="unit_hours">час</string>
<string name="unit_days">дн</string>
<string name="unit_weeks">нед</string>
<string name="shortminute">м</string>
<string name="shortday">д</string>
<string name="later_today">Позднее сегодня</string>
<string name="tomorrow">Завтра</string>
<string name="today">Cегодня</string>
<string name="yesterday">Вчера</string>
<!-- Rx -->
<string name="connecting_for">Связь установлена за %1$d сек</string>
<string name="handshaking">Подтверждение связи</string>
<string name="connected">соединение установлено</string>
<string name="disconnecting">разъединение</string>
<string name="waiting_for_disconnection">Ожидание разъединения</string>
<!-- Custom Watchface -->
<string name="pref_show_delta">Отображать дельту</string>
</resources>

View file

@ -1,93 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- DateUtil-->
<string name="minago">pred %1$d min</string>
<string name="minago_long">pred %1$d minútami</string>
<string name="hoursago">pred %1$.1f h</string>
<string name="days_ago">Pred %1$.1f dňami</string>
<string name="days_ago_round">Pred %1$.0f dňami</string>
<string name="in_days">za %1$.0f dní</string>
<string name="in_days_round">za %1$.0f dní</string>
<string name="shorthour">h</string>
<string name="days">dní</string>
<string name="hours">hodín</string>
<string name="unit_second">sekunda</string>
<string name="unit_minute">minúta</string>
<string name="unit_hour">hodina</string>
<string name="unit_day">deň</string>
<string name="unit_week">týždeň</string>
<string name="unit_seconds">sekúnd</string>
<string name="unit_minutes">minút</string>
<string name="unit_hours">hodín</string>
<string name="unit_days">dní</string>
<string name="unit_weeks">týždňov</string>
<string name="shortminute">m</string>
<string name="shortday">d</string>
<string name="later_today">Neskôr počas dňa</string>
<string name="tomorrow">Zajtra</string>
<string name="today">Dnes</string>
<string name="yesterday">včera</string>
<!-- Rx -->
<string name="connecting_for">Pripájanie %1$d sek</string>
<string name="handshaking">Overovanie</string>
<string name="connected">Pripojené</string>
<string name="disconnecting">Odpájanie</string>
<string name="waiting_for_disconnection">Čakám na odpojenie</string>
<!-- Custom Watchface -->
<string name="metadata_label_watchface_created_at">Vytvorené: %1$s</string>
<string name="metadata_label_watchface_author">Autor: %1$s</string>
<string name="metadata_label_watchface_name">Meno: %1$s</string>
<string name="metadata_wear_import_filename">Názov súboru: %1$s</string>
<string name="metadata_label_plugin_version">Verzia pluginu: %1$s</string>
<string name="metadata_label_watchface_name_version">Meno: %1$s (%2$s)</string>
<string name="metadata_label_watchface_infos">Informácie: %1$s</string>
<string name="pref_show_iob">Zobraziť IOB</string>
<string name="pref_show_detailed_iob">Zobraziť detailný IOB</string>
<string name="pref_show_cob">Zobraziť COB</string>
<string name="pref_show_delta">Zobraziť odchýlku</string>
<string name="pref_show_detailed_delta">Zobraziť detailnú odchylku</string>
<string name="pref_show_avgdelta">Zobraziť priemernú odchýlku</string>
<string name="pref_show_phone_battery">Zobraziť stav batérie telefónu</string>
<string name="pref_show_rig_battery">Zobrazovať stav batérie ďalších zariadení</string>
<string name="pref_show_basal_rate">Zobraziť bazál</string>
<string name="pref_show_loop_status">Zobraziť stav uzavretého okruhu</string>
<string name="pref_show_bg">Zobraziť glykémiu</string>
<string name="pref_show_bgi">Zobraziť BGI</string>
<string name="pref_show_direction_arrow">Zobraziť trendovú šípku</string>
<string name="pref_show_ago">Zobraziť aktualizované pred</string>
<string name="default_custom_watchface_comment">Predvolený ciferník. Môžete kliknúť na tlačítko EXPORTOVAŤ CIFERNÍK pre vygenerovanie šablóny</string>
<string name="wear_default_watchface">Predvolený ciferník</string>
<string name="cwf_comment_background">Obrázok pozadia</string>
<string name="cwf_comment_chart">Grafy (glykémie, bazály, krivky predpovedí...)</string>
<string name="cwf_comment_cover_chart">Obrázok pred grafom a za textovými poliami</string>
<string name="cwf_comment_freetext1">Voľný text 1</string>
<string name="cwf_comment_freetext2">Voľný text 2</string>
<string name="cwf_comment_freetext3">Voľný text 3</string>
<string name="cwf_comment_freetext4">Voľný text 4</string>
<string name="cwf_comment_iob1">Štítok IOB alebo suma IOB pri zapnutých detailoch</string>
<string name="cwf_comment_iob2">Suma IOB alebo (Bolus_IOB|Basal_IOB) pri zapnutých detailoch</string>
<string name="cwf_comment_cob1">Štítok COB</string>
<string name="cwf_comment_cob2">Hodnota COB</string>
<string name="cwf_comment_delta">Krátkodobý priemer</string>
<string name="cwf_comment_avg_delta">Priemerný rozdiel glykémií (15min)</string>
<string name="cwf_comment_uploader_battery">Batéria telefónu (%)</string>
<string name="cwf_comment_rig_battery">Batéria uzavretého okruhu (%)</string>
<string name="cwf_comment_basalRate">Bazálna dávka</string>
<string name="cwf_comment_bgi">Hodnota BGI</string>
<string name="cwf_comment_time">Čas (HH:MM alebo HH:MM:SS)</string>
<string name="cwf_comment_hour">Hodiny (HH)</string>
<string name="cwf_comment_minute">Minúty (MM)</string>
<string name="cwf_comment_second">Sekundy (SS)</string>
<string name="cwf_comment_timePeriod">AM alebo PM</string>
<string name="cwf_comment_day_name">Meno dňa v týždni</string>
<string name="cwf_comment_day">Deň (DD)</string>
<string name="cwf_comment_month">Názov mesiaca (krátky)</string>
<string name="cwf_comment_loop">Stav uzavretého okruhu a čas</string>
<string name="cwf_comment_direction">Trendová šípka</string>
<string name="cwf_comment_timestamp">Pred minútami pre poslednú prijatú glykémiu</string>
<string name="cwf_comment_sgv">Hodnota glykémie</string>
<string name="cwf_comment_cover_plate">Úvodný obrázok pred textom (číselníky...)</string>
<string name="cwf_comment_hour_hand">Obrázok hodinovej ručičky (Analógové hodinky)</string>
<string name="cwf_comment_minute_hand">Obrázok minútovej ručičky (Analógové hodinky)</string>
<string name="cwf_comment_second_hand">Obrázok sekundovej ručičky (Analógové hodinky)</string>
</resources>

View file

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- DateUtil-->
<!-- Rx -->
<!-- Custom Watchface -->
</resources>

View file

@ -1,90 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- DateUtil-->
<string name="hoursago">%1$.1f tim sedan</string>
<string name="days_ago">%1$.1f dagar sedan</string>
<string name="days_ago_round">%1$.0f dagar sedan</string>
<string name="in_days">om %1$.0f dagar</string>
<string name="in_days_round">om %1$.0f dagar</string>
<string name="shorthour">h</string>
<string name="days">dagar</string>
<string name="hours">timmar</string>
<string name="unit_second">sekund</string>
<string name="unit_minute">minut</string>
<string name="unit_hour">timme</string>
<string name="unit_day">dag</string>
<string name="unit_week">vecka</string>
<string name="unit_seconds">sekunder</string>
<string name="unit_minutes">minuter</string>
<string name="unit_hours">timmar</string>
<string name="unit_days">dagar</string>
<string name="unit_weeks">veckor</string>
<string name="shortminute">m</string>
<string name="shortday">d</string>
<string name="later_today">Senare idag</string>
<string name="tomorrow">Imorgon</string>
<string name="today">Idag</string>
<string name="yesterday">Igår</string>
<!-- Rx -->
<string name="connecting_for">Ansluter (%1$d s)</string>
<string name="handshaking">Anslutningen verifieras</string>
<string name="connected">Ansluten</string>
<string name="disconnecting">Kopplar från</string>
<string name="waiting_for_disconnection">Väntar på frånkoppling</string>
<!-- Custom Watchface -->
<string name="metadata_label_watchface_created_at">Skapad den: %1$s</string>
<string name="metadata_label_watchface_author">Skapad av: %1$s</string>
<string name="metadata_label_watchface_name">Namn: %1$s</string>
<string name="metadata_wear_import_filename">Filnamn: %1$s</string>
<string name="metadata_label_plugin_version">Plugin-version: %1$s</string>
<string name="metadata_label_watchface_name_version">Namn: %1$s (%2$s)</string>
<string name="pref_show_iob">Visa IOB</string>
<string name="pref_show_detailed_iob">Visa detaljerad IOB</string>
<string name="pref_show_cob">Visa COB</string>
<string name="pref_show_delta">Visa delta</string>
<string name="pref_show_detailed_delta">Visa detaljerad delta</string>
<string name="pref_show_avgdelta">Visa genomsnittlig delta</string>
<string name="pref_show_phone_battery">Visa telefonens batterinivå</string>
<string name="pref_show_rig_battery">Visa riggens batterinivå</string>
<string name="pref_show_basal_rate">Visa basaldos</string>
<string name="pref_show_loop_status">Visa loop-status</string>
<string name="pref_show_bg">Visa BG</string>
<string name="pref_show_bgi">Visa BGI</string>
<string name="pref_show_direction_arrow">Visa riktningspil</string>
<string name="pref_show_ago">Visa tid sedan</string>
<string name="default_custom_watchface_comment">Standard-urtavla - du kan klicka på EXPORTERA URTAVLA för att generera en mall</string>
<string name="wear_default_watchface">Standard-urtavla</string>
<string name="cwf_comment_background">Bakgrundsbild</string>
<string name="cwf_comment_chart">Grafer (BG, basal, prognoslinjer...)</string>
<string name="cwf_comment_cover_chart">Bild framför graf och bakom textfält</string>
<string name="cwf_comment_freetext1">Fritext 1</string>
<string name="cwf_comment_freetext2">Fritext 2</string>
<string name="cwf_comment_freetext3">Fritext 3</string>
<string name="cwf_comment_freetext4">Fritext 4</string>
<string name="cwf_comment_iob1">IOB-etikett. Total IOB om detaljerad</string>
<string name="cwf_comment_iob2">Total IOB. (Bolus_IOB|Basal_IOB) om detaljerad</string>
<string name="cwf_comment_cob1">COB-etikett</string>
<string name="cwf_comment_cob2">COB-värde</string>
<string name="cwf_comment_delta">Kort BG-delta</string>
<string name="cwf_comment_avg_delta">Genomsnittligt BG-delta (15min)</string>
<string name="cwf_comment_uploader_battery">Telefonens batterinivå (%)</string>
<string name="cwf_comment_rig_battery">Globalt loop-batteri (%)</string>
<string name="cwf_comment_basalRate">Basaldos</string>
<string name="cwf_comment_bgi">BGI-värde</string>
<string name="cwf_comment_time">Tid (HH:MM eller HH:MM:SS)</string>
<string name="cwf_comment_hour">Timme (HH)</string>
<string name="cwf_comment_minute">Minut (MM)</string>
<string name="cwf_comment_second">Sekund (SS)</string>
<string name="cwf_comment_timePeriod">AM eller PM</string>
<string name="cwf_comment_day_name">Namn på veckodagen</string>
<string name="cwf_comment_day">Dag (DD)</string>
<string name="cwf_comment_month">Månadens namn (kort)</string>
<string name="cwf_comment_loop">Loop status och tid</string>
<string name="cwf_comment_direction">Visa riktningspil</string>
<string name="cwf_comment_timestamp">Minuter sedan senast mottaget BG</string>
<string name="cwf_comment_sgv">BG-värde</string>
<string name="cwf_comment_cover_plate">Omslagsbild framför text (visare...)</string>
<string name="cwf_comment_hour_hand">Bild för timvisare (analog klocka)</string>
<string name="cwf_comment_minute_hand">Bild för minutvisare (analog klocka)</string>
<string name="cwf_comment_second_hand">Bild för sekundvisare (analog klocka)</string>
</resources>

View file

@ -1,93 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- DateUtil-->
<string name="minago">%1$d dak önce</string>
<string name="minago_long">%1$d dakika önce</string>
<string name="hoursago">%1$.1f s önce</string>
<string name="days_ago">%1$.1f gün önce</string>
<string name="days_ago_round">%1$.0f gün önce</string>
<string name="in_days">%1$.0f gün içinde</string>
<string name="in_days_round">%1$.0f gün içinde</string>
<string name="shorthour">s</string>
<string name="days">gün</string>
<string name="hours">saat</string>
<string name="unit_second">saniye</string>
<string name="unit_minute">dakika</string>
<string name="unit_hour">saat</string>
<string name="unit_day">gün</string>
<string name="unit_week">hafta</string>
<string name="unit_seconds">saniye</string>
<string name="unit_minutes">dakika</string>
<string name="unit_hours">saat</string>
<string name="unit_days">gün</string>
<string name="unit_weeks">hafta</string>
<string name="shortminute">d</string>
<string name="shortday">g</string>
<string name="later_today">Bugünden sonra</string>
<string name="tomorrow">Yarın</string>
<string name="today">Bugün</string>
<string name="yesterday">Dün</string>
<!-- Rx -->
<string name="connecting_for">%1$d bağlanıyor</string>
<string name="handshaking">Bağlandı</string>
<string name="connected">Bağlandı</string>
<string name="disconnecting">Bağlantı kesiliyor</string>
<string name="waiting_for_disconnection">Bağlantının kesilmesi bekleniyor</string>
<!-- Custom Watchface -->
<string name="metadata_label_watchface_created_at">Oluşturuldu: %1$s</string>
<string name="metadata_label_watchface_author">Yetki: %1$s</string>
<string name="metadata_label_watchface_name">İsim: %1$s</string>
<string name="metadata_wear_import_filename">Dosya adı: %1$s</string>
<string name="metadata_label_plugin_version">Eklenti sürümü: %1$s</string>
<string name="metadata_label_watchface_name_version">İsim: %1$s (%2$s)</string>
<string name="metadata_label_watchface_infos">Bilgi: %1$s</string>
<string name="pref_show_iob">AİNS Göster</string>
<string name="pref_show_detailed_iob">Detalı AİNS göster</string>
<string name="pref_show_cob">AKRB göster</string>
<string name="pref_show_delta">Deltayı göster</string>
<string name="pref_show_detailed_delta">Detaylı Delta göster</string>
<string name="pref_show_avgdelta">OrtDelta\'yı Göster</string>
<string name="pref_show_phone_battery">Telefon Pilini Göster</string>
<string name="pref_show_rig_battery">Teçhizat Pilini Göster</string>
<string name="pref_show_basal_rate">Bazal Oranı Göster</string>
<string name="pref_show_loop_status">Döngü Durumunu Göster</string>
<string name="pref_show_bg">KŞ\'ni göster</string>
<string name="pref_show_bgi">KŞ Etkisi Göster</string>
<string name="pref_show_direction_arrow">Yön Oku Göster</string>
<string name="pref_show_ago">Önce Göster</string>
<string name="default_custom_watchface_comment">Varsayılan saat arayüzü; bir şablon oluşturmak için SAAT ARAYÜZÜNÜ DIŞA AKTAR butonuna tıklayabilirsiniz</string>
<string name="wear_default_watchface">Varsayılan saat arayüzü</string>
<string name="cwf_comment_background">Arka plan görüntüsü</string>
<string name="cwf_comment_chart">Grafik (KŞ, bazal, tahmin çizgileri...)</string>
<string name="cwf_comment_cover_chart">Grafiğin önündeki ve metin alanlarının arkasındaki resim</string>
<string name="cwf_comment_freetext1">Serbest metin 1</string>
<string name="cwf_comment_freetext2">Serbest metin 2</string>
<string name="cwf_comment_freetext3">Serbest metin 3</string>
<string name="cwf_comment_freetext4">Serbest metin 4</string>
<string name="cwf_comment_iob1">Ayrıntılıysa AİNS etiketi veya AİNS Toplamı</string>
<string name="cwf_comment_iob2">AİNS Toplamı veya ayrıntılıysa (Bolus_AİNS|Basal_AİNS)</string>
<string name="cwf_comment_cob1">AKRB etiketi</string>
<string name="cwf_comment_cob2">AKRB değeri</string>
<string name="cwf_comment_delta">Kısa KŞ delta</string>
<string name="cwf_comment_avg_delta">Ortalama KŞ delta (15dk)</string>
<string name="cwf_comment_uploader_battery">Telefon pili (%)</string>
<string name="cwf_comment_rig_battery">Global döngü pili (%)</string>
<string name="cwf_comment_basalRate">Bazal Oranı</string>
<string name="cwf_comment_bgi">KŞ etkisi değeri</string>
<string name="cwf_comment_time">Saat (SS:DD veya SS:DD:SS)</string>
<string name="cwf_comment_hour">Saat (SS)</string>
<string name="cwf_comment_minute">Dakika (DD)</string>
<string name="cwf_comment_second">Saniye (SS)</string>
<string name="cwf_comment_timePeriod">AM veya PM</string>
<string name="cwf_comment_day_name">Haftanın gününün adı</string>
<string name="cwf_comment_day">Gün (GG)</string>
<string name="cwf_comment_month">Ay adı (kısa)</string>
<string name="cwf_comment_loop">Döngü durumu ve öncesi</string>
<string name="cwf_comment_direction">Yön Okları</string>
<string name="cwf_comment_timestamp">Birkaç dakika önce son alınan KŞ</string>
<string name="cwf_comment_sgv">KŞ değeri</string>
<string name="cwf_comment_cover_plate">Metnin önündeki kapak resmi (kadranlar...)</string>
<string name="cwf_comment_hour_hand">Akrep şekli (Analog Saat)</string>
<string name="cwf_comment_minute_hand">Yelkovan şekli (Analog Saat)</string>
<string name="cwf_comment_second_hand">Saniye şekli (Analog Saat)</string>
</resources>

View file

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- DateUtil-->
<!-- Rx -->
<!-- Custom Watchface -->
</resources>

View file

@ -1,37 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- DateUtil-->
<string name="minago">%1$d 分钟前</string>
<string name="minago_long">%1$d 分钟前</string>
<string name="hoursago">%1$.1f 小时前</string>
<string name="days_ago">%1$.1f 天前</string>
<string name="days_ago_round">%1$.0f 天前</string>
<string name="in_days">在 %1$.0f 天内</string>
<string name="in_days_round">在 %1$.0f 天内</string>
<string name="shorthour">h</string>
<string name="days"></string>
<string name="hours">小时</string>
<string name="unit_second"></string>
<string name="unit_minute">分钟</string>
<string name="unit_hour">小时</string>
<string name="unit_day"></string>
<string name="unit_week"></string>
<string name="unit_seconds"></string>
<string name="unit_minutes">分钟</string>
<string name="unit_hours">小时</string>
<string name="unit_days"></string>
<string name="unit_weeks"></string>
<string name="shortminute">m</string>
<string name="shortday">d</string>
<string name="later_today">今天稍后</string>
<string name="tomorrow">明天</string>
<string name="today">今天</string>
<string name="yesterday">昨天</string>
<!-- Rx -->
<string name="connecting_for">正在连接 %1$d s</string>
<string name="handshaking">握手</string>
<string name="connected">已连接</string>
<string name="disconnecting">正在断开连接</string>
<string name="waiting_for_disconnection">正在等待连接</string>
<!-- Custom Watchface -->
</resources>

View file

@ -1,103 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="key_insulin_button_increment_1" translatable="false">insulin_button_increment_1</string>
<string name="key_insulin_button_increment_2" translatable="false">insulin_button_increment_2</string>
<string name="key_insulin_button_increment_3" translatable="false">insulin_button_increment_3</string>
<!-- DateUtil-->
<string name="minago">%1$d m ago</string>
<string name="minago_long">%1$d minutes ago</string>
<string name="hoursago">%1$.1f h ago</string>
<string name="days_ago">%1$.1f days ago</string>
<string name="days_ago_round">%1$.0f days ago</string>
<string name="in_days">in %1$.0f days</string>
<string name="in_days_round">in %1$.0f days</string>
<string name="shorthour">h</string>
<string name="days">days</string>
<string name="hours">hours</string>
<string name="unit_second">second</string>
<string name="unit_minute">minute</string>
<string name="unit_hour">hour</string>
<string name="unit_day">day</string>
<string name="unit_week">week</string>
<string name="unit_seconds">seconds</string>
<string name="unit_minutes">minutes</string>
<string name="unit_hours">hours</string>
<string name="unit_days">days</string>
<string name="unit_weeks">weeks</string>
<string name="shortminute">m</string>
<string name="shortday">d</string>
<string name="later_today">Later today</string>
<string name="tomorrow">Tomorrow</string>
<string name="today">Today</string>
<string name="yesterday">Yesterday</string>
<!-- Rx -->
<string name="connecting_for">Connecting for %1$d s</string>
<string name="handshaking">Handshaking</string>
<string name="connected">Connected</string>
<string name="disconnecting">Disconnecting</string>
<string name="waiting_for_disconnection">Waiting for disconnection</string>
<!-- Custom Watchface -->
<string name="metadata_label_watchface_created_at">Created at: %1$s</string>
<string name="metadata_label_watchface_author">Author: %1$s</string>
<string name="metadata_label_watchface_name">Name: %1$s</string>
<string name="metadata_wear_import_filename">File name: %1$s</string>
<string name="metadata_label_plugin_version">Plugin version: %1$s</string>
<string name="metadata_label_watchface_name_version">Name: %1$s (%2$s)</string>
<string name="metadata_label_watchface_infos">Info: %1$s</string>
<string name="metadata_label_watchface_authorization" translatable="false">%1$s</string>
<string name="pref_show_iob">Show IOB</string>
<string name="pref_show_detailed_iob">Show detailed IOB</string>
<string name="pref_show_cob">Show COB</string>
<string name="pref_show_delta">Show Delta</string>
<string name="pref_show_detailed_delta">Show detailed Delta</string>
<string name="pref_show_avgdelta">Show AvgDelta</string>
<string name="pref_show_phone_battery">Show Phone Battery</string>
<string name="pref_show_rig_battery">Show Rig Battery</string>
<string name="pref_show_basal_rate">Show Basal Rate</string>
<string name="pref_show_loop_status">Show Loop Status</string>
<string name="pref_show_bg">Show BG</string>
<string name="pref_show_bgi">Show BGI</string>
<string name="pref_show_direction_arrow">Show Direction Arrow</string>
<string name="pref_show_ago">Show Ago</string>
<string name="pref_show_week_number">Show Week number</string>
<string name="default_custom_watchface_comment">Default watchface, you can click on EXPORT WATCHFACE button to generate a template</string>
<string name="wear_default_watchface">Default Watchface</string>
<string name="cwf_comment_background">Background image</string>
<string name="cwf_comment_chart">Graphs (BG, basal, prediction lines...)</string>
<string name="cwf_comment_cover_chart">Image in front of graph and behind text fields</string>
<string name="cwf_comment_freetext1">Free text 1</string>
<string name="cwf_comment_freetext2">Free text 2</string>
<string name="cwf_comment_freetext3">Free text 3</string>
<string name="cwf_comment_freetext4">Free text 4</string>
<string name="cwf_comment_iob1">IOB label or IOB Sum if detailed</string>
<string name="cwf_comment_iob2">IOB Sum or (Bolus_IOB|Basal_IOB) if detailed</string>
<string name="cwf_comment_cob1">COB label</string>
<string name="cwf_comment_cob2">COB value</string>
<string name="cwf_comment_delta">Short BG delta</string>
<string name="cwf_comment_avg_delta">Average BG delta (15min)</string>
<string name="cwf_comment_uploader_battery">Phone battery (%)</string>
<string name="cwf_comment_rig_battery">Global loop battery (%)</string>
<string name="cwf_comment_basalRate">Basal Rate</string>
<string name="cwf_comment_bgi">BGI value</string>
<string name="cwf_comment_time">Time (HH:MM or HH:MM:SS)</string>
<string name="cwf_comment_hour">Hour (HH)</string>
<string name="cwf_comment_minute">Minute (MM)</string>
<string name="cwf_comment_second">Second (SS)</string>
<string name="cwf_comment_timePeriod">AM or PM</string>
<string name="cwf_comment_day_name">Name of day of the week</string>
<string name="cwf_comment_day">Day (DD)</string>
<string name="cwf_comment_week_number">Week number (ww)</string>
<string name="cwf_comment_month">Month name (short)</string>
<string name="cwf_comment_loop">Loop status and ago</string>
<string name="cwf_comment_direction">Direction arrow</string>
<string name="cwf_comment_timestamp">Mintutes ago for last received BG</string>
<string name="cwf_comment_sgv">BG value</string>
<string name="cwf_comment_cover_plate">Cover image in front of text (dials…)</string>
<string name="cwf_comment_hour_hand">Image of hour hand (Analog Watch)</string>
<string name="cwf_comment_minute_hand">Image of minute hand (Analog Watch)</string>
<string name="cwf_comment_second_hand">Image of second hand (Analog Watch)</string>
</resources>

View file

@ -1,197 +0,0 @@
package info.nightscout.rx.weardata
import kotlinx.serialization.ExperimentalSerializationApi
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
import org.mockito.junit.jupiter.MockitoExtension
import org.mockito.junit.jupiter.MockitoSettings
import org.mockito.quality.Strictness
@ExperimentalSerializationApi
@ExtendWith(MockitoExtension::class)
@MockitoSettings(strictness = Strictness.LENIENT)
class EventDataTest {
@BeforeEach
fun setUp() {
}
@Test
fun serializationTest() {
EventData.ActionPong(1, 2).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.WearException(1, byteArrayOf(0xAA.toByte()), "board", "fingerprint", "sdk", "model", "manufacturer", "product").let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.Error(1).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.CancelBolus(1).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionResendData("data").let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionPumpStatus(1).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionLoopStatus(1).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionTddStatus(1).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionECarbsPreCheck(1, 2, 3).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionBolusPreCheck(1.0, 2).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionFillPreCheck(1.0).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionFillPresetPreCheck(1).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionProfileSwitchSendInitialData(1).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionProfileSwitchPreCheck(1, 2).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionWizardPreCheck(1, 2).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionQuickWizardPreCheck("guid").let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionHeartRate(1, 2, 3.0, "device").let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionTempTargetPreCheck(EventData.ActionTempTargetPreCheck.TempTargetCommand.CANCEL).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionWizardConfirmed(1).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionTempTargetConfirmed(false).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionBolusConfirmed(1.0, 2).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionECarbsConfirmed(1, 2, 3).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionFillConfirmed(1.0).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionProfileSwitchConfirmed(1, 2).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.OpenLoopRequestConfirmed(1).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.CancelNotification(1).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
// EventData.ActionGetCustomWatchface(EventData.ActionSetCustomWatchface(CwfData())).let {
// Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
// Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
// }
EventData.ActionPing(1).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.OpenSettings(1).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.BolusProgress(1, "status").let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.SingleBg(1, sgv = 2.0, high = 3.0, low = 4.0).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.GraphData(arrayListOf(EventData.SingleBg(1, sgv = 2.0, high = 3.0, low = 4.0))).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.TreatmentData(
arrayListOf(EventData.TreatmentData.TempBasal(1, 2.0, 3, 4.0, 5.0)),
arrayListOf(EventData.TreatmentData.Basal(1, 2, 3.0)),
arrayListOf(EventData.TreatmentData.Treatment(1, 2.0, 3.0, true, isValid = true)),
arrayListOf(EventData.SingleBg(1, sgv = 2.0, high = 3.0, low = 4.0))
).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.Preferences(1, wearControl = true, true, 2, 3, 4.0, 5.0, 6.0, 7, 8).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.QuickWizard(arrayListOf(EventData.QuickWizard.QuickWizardEntry("1", "2", 3, 4, 5))).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
// EventData.ActionSetCustomWatchface().let {
// Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
// Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
// }
EventData.ActionrequestCustomWatchface(true).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionrequestSetDefaultWatchface(1).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ActionProfileSwitchOpenActivity(1, 2).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.OpenLoopRequest("1", "2", null).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.ConfirmAction("1", "2", null).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
EventData.SnoozeAlert(1).let {
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
}
}
}

View file

@ -1,112 +0,0 @@
package info.nightscout.shared
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.Test
@Suppress("SpellCheckingInspection")
class SafeParseTest {
@Test fun stringToDoubleTest() {
// correct values
Assertions.assertEquals(0.1234, SafeParse.stringToDouble("0.1234"), 0.001)
Assertions.assertEquals(0.1234, SafeParse.stringToDouble("0,1234"), 0.001)
Assertions.assertEquals(0.5436564812, SafeParse.stringToDouble(".5436564812"), 0.001)
Assertions.assertEquals(0.5436564812, SafeParse.stringToDouble(",5436564812"), 0.001)
Assertions.assertEquals(1000500100900.0, SafeParse.stringToDouble("1000500100900"), 0.001)
Assertions.assertEquals(42.0, SafeParse.stringToDouble("42"), 0.001)
// units or other extra values are not permitted
Assertions.assertEquals(0.0, SafeParse.stringToDouble("12 U/h"), 0.001)
// strings are not parsable
Assertions.assertEquals(0.0, SafeParse.stringToDouble("ala ma kota"), 0.001)
// separator errors
Assertions.assertEquals(0.0, SafeParse.stringToDouble("0.1234.5678"), 0.001)
Assertions.assertEquals(0.0, SafeParse.stringToDouble("0,1234,5678"), 0.001)
// various emptiness
Assertions.assertEquals(0.0, SafeParse.stringToDouble(""), 0.001)
Assertions.assertEquals(0.0, SafeParse.stringToDouble(" "), 0.001)
Assertions.assertEquals(0.0, SafeParse.stringToDouble("\n\r"), 0.001)
}
@Test fun stringToIntTest() {
// correct values
Assertions.assertEquals(1052934, SafeParse.stringToInt("1052934"))
Assertions.assertEquals(-42, SafeParse.stringToInt("-42"))
Assertions.assertEquals(2147483647, SafeParse.stringToInt("2147483647"))
Assertions.assertEquals(-2147483648, SafeParse.stringToInt("-2147483648"))
// outside Integer range
Assertions.assertEquals(0, SafeParse.stringToInt("2147483648"))
Assertions.assertEquals(0, SafeParse.stringToInt("-2147483649"))
// units or other extra values are not permitted
Assertions.assertEquals(0, SafeParse.stringToInt("12 U/h"))
Assertions.assertEquals(0, SafeParse.stringToInt("0.1234"))
Assertions.assertEquals(0, SafeParse.stringToInt("0,1234"))
Assertions.assertEquals(0, SafeParse.stringToInt(".5436564812"))
Assertions.assertEquals(0, SafeParse.stringToInt(",5436564812"))
Assertions.assertEquals(0, SafeParse.stringToInt("42.1234"))
Assertions.assertEquals(0, SafeParse.stringToInt("42,1234"))
Assertions.assertEquals(0, SafeParse.stringToInt("3212.5436564812"))
Assertions.assertEquals(0, SafeParse.stringToInt("3212,5436564812"))
Assertions.assertEquals(0, SafeParse.stringToInt("1000500100900"))
// strings are not parsable
Assertions.assertEquals(0, SafeParse.stringToInt("ala ma kota"))
// various emptiness
Assertions.assertEquals(0, SafeParse.stringToInt(""))
Assertions.assertEquals(0, SafeParse.stringToInt(" "))
Assertions.assertEquals(0, SafeParse.stringToInt("\n\r"))
}
@Test fun stringToLongTest() {
// correct values
Assertions.assertEquals(1052934L, SafeParse.stringToLong("1052934"))
Assertions.assertEquals(-42L, SafeParse.stringToLong("-42"))
Assertions.assertEquals(2147483647L, SafeParse.stringToLong("2147483647"))
Assertions.assertEquals(-2147483648L, SafeParse.stringToLong("-2147483648"))
Assertions.assertEquals(1000500100900L, SafeParse.stringToLong("1000500100900"))
// outside Integer range
Assertions.assertEquals(2147483648L, SafeParse.stringToLong("2147483648"))
Assertions.assertEquals(-2147483649L, SafeParse.stringToLong("-2147483649"))
// units or other extra values are not permitted
Assertions.assertEquals(0L, SafeParse.stringToLong("12 U/h"))
Assertions.assertEquals(0L, SafeParse.stringToLong("0.1234"))
Assertions.assertEquals(0L, SafeParse.stringToLong("0,1234"))
Assertions.assertEquals(0L, SafeParse.stringToLong(".5436564812"))
Assertions.assertEquals(0L, SafeParse.stringToLong(",5436564812"))
Assertions.assertEquals(0L, SafeParse.stringToLong("42.1234"))
Assertions.assertEquals(0L, SafeParse.stringToLong("42,1234"))
Assertions.assertEquals(0L, SafeParse.stringToLong("3212.5436564812"))
Assertions.assertEquals(0L, SafeParse.stringToLong("3212,5436564812"))
// strings are not parsable
Assertions.assertEquals(0L, SafeParse.stringToLong("ala ma kota"))
// various emptiness
Assertions.assertEquals(0L, SafeParse.stringToLong(""))
Assertions.assertEquals(0L, SafeParse.stringToLong(" "))
Assertions.assertEquals(0L, SafeParse.stringToLong("\n\r"))
}
@Test
fun stringToDoubleNullTest() {
Assertions.assertEquals(0.0, SafeParse.stringToDouble(null), 0.001)
}
@Test
fun stringToIntNullTest() {
Assertions.assertEquals(0, SafeParse.stringToInt(null))
}
@Test
fun stringToLongNullTest() {
Assertions.assertEquals(0L, SafeParse.stringToLong(null))
}
}

View file

@ -181,7 +181,6 @@ dependencies {
// in order to use internet's versions you'd need to enable Jetifier again // in order to use internet's versions you'd need to enable Jetifier again
// https://github.com/nightscout/graphview.git // https://github.com/nightscout/graphview.git
// https://github.com/nightscout/iconify.git // https://github.com/nightscout/iconify.git
implementation project(':app-wear-shared:shared')
implementation project(':app-wear-shared:shared-impl') implementation project(':app-wear-shared:shared-impl')
implementation project(':core:main') implementation project(':core:main')
implementation project(':core:graphview') implementation project(':core:graphview')
@ -216,7 +215,6 @@ dependencies {
implementation project(':insight') implementation project(':insight')
implementation project(':pump:medtronic') implementation project(':pump:medtronic')
implementation project(':pump:pump-common') implementation project(':pump:pump-common')
implementation project(':pump:pump-core')
implementation project(':pump:omnipod-common') implementation project(':pump:omnipod-common')
implementation project(':pump:omnipod-eros') implementation project(':pump:omnipod-eros')
implementation project(':pump:omnipod-dash') implementation project(':pump:omnipod-dash')

View file

@ -1,102 +1,98 @@
package info.nightscout.androidaps package info.nightscout.androidaps
import androidx.test.ext.junit.runners.AndroidJUnit4 //@LargeTest
import androidx.test.filters.LargeTest //@RunWith(AndroidJUnit4::class)
import org.junit.runner.RunWith
@LargeTest
@RunWith(AndroidJUnit4::class)
class RealPumpTest { class RealPumpTest {
/* /*
companion object { companion object {
const val R_PASSWORD = 1234 const val R_PASSWORD = 1234
const val R_SERIAL = "PBB00013LR_P" const val R_SERIAL = "PBB00013LR_P"
}
private val validProfile = "{\"dia\":\"6\",\"carbratio\":[{\"time\":\"00:00\",\"value\":\"30\"}],\"carbs_hr\":\"20\",\"delay\":\"20\",\"sens\":[{\"time\":\"00:00\",\"value\":\"10\"},{\"time\":\"2:00\",\"value\":\"11\"}],\"timezone\":\"UTC\",\"basal\":[{\"time\":\"00:00\",\"value\":\"0.1\"}],\"target_low\":[{\"time\":\"00:00\",\"value\":\"4\"}],\"target_high\":[{\"time\":\"00:00\",\"value\":\"5\"}],\"startDate\":\"1970-01-01T00:00:00.000Z\",\"units\":\"mmol\"}"
@Inject lateinit var pump : info.nightscout.androidaps.danaRv2.DanaRv2Plugin
@Inject lateinit var randomBgPlugin :RandomBgPlugin
@Inject lateinit var localProfilePlugin: LocalProfilePlugin
@Inject lateinit var profileFunction: ProfileFunction
@Inject lateinit var insulinOrefUltraRapidActingPlugin: InsulinOrefUltraRapidActingPlugin
@Inject lateinit var sensitivityOref1Plugin: SensitivityOref1Plugin
@Inject lateinit var openAPSSMBPlugin: OpenAPSSMBPlugin
@Inject lateinit var loopPlugin: LoopPlugin
@Inject lateinit var actionsPlugin: ActionsPlugin
@Inject lateinit var configBuilderPlugin: ConfigBuilderPlugin
@Inject lateinit var objectivesPlugin: ObjectivesPlugin
@Inject lateinit var treatmentsPlugin: TreatmentsPlugin
@Inject lateinit var sp: SP
@Rule
@JvmField
var mActivityTestRule = ActivityTestRule(MainActivity::class.java)
@Rule
@JvmField
var mGrantPermissionRule: GrantPermissionRule =
GrantPermissionRule.grant(
android.Manifest.permission.ACCESS_FINE_LOCATION,
android.Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE
)
@Before
fun clear() {
sp.clear()
sp.putBoolean(R.string.key_setupwizard_processed, true)
sp.putString(R.string.key_aps_mode, "closed")
MainApp.getDbHelper().resetDatabases()
MainApp.devBranch = false
}
private fun preparePlugins() {
// Source
configBuilderPlugin.performPluginSwitch(randomBgPlugin,true, PluginType.BGSOURCE)
// Profile
configBuilderPlugin.performPluginSwitch(localProfilePlugin, true, PluginType.PROFILE)
val profile = Profile(JSONObject(validProfile), Constants.MGDL)
Assert.assertTrue(profile.isValid("Test"))
localProfilePlugin.profiles.clear()
localProfilePlugin.numOfProfiles = 0
val singleProfile = LocalProfilePlugin.SingleProfile().copyFrom(localProfilePlugin.rawProfile, profile, "TestProfile")
localProfilePlugin.addProfile(singleProfile)
val profileSwitch = profileFunction.prepareProfileSwitch(localProfilePlugin.createProfileStore(), "TestProfile", 0, 100, 0, dateUtil._now())
treatmentsPlugin.addToHistoryProfileSwitch(profileSwitch)
// Insulin
configBuilderPlugin.performPluginSwitch(insulinOrefUltraRapidActingPlugin, true, PluginType.INSULIN)
// Pump
sp.putInt(R.string.key_danar_password, R_PASSWORD)
sp.putString(R.string.key_danar_bt_name, R_SERIAL)
configBuilderPlugin.performPluginSwitch((pump as PluginBase), true, PluginType.PUMP)
// Sensitivity
configBuilderPlugin.performPluginSwitch(sensitivityOref1Plugin, true, PluginType.SENSITIVITY)
// APS
configBuilderPlugin.performPluginSwitch(openAPSSMBPlugin, true, PluginType.APS)
configBuilderPlugin.performPluginSwitch(loopPlugin, true, PluginType.LOOP)
// Enable common
configBuilderPlugin.performPluginSwitch(actionsPlugin, true, )
// Disable unneeded
MainApp.getPluginsList().remove(objectivesPlugin)
}
@Test
fun doTest() {
Assert.assertTrue(isRunningTest())
preparePlugins()
while (!pump.isInitialized) {
//log.debug("Waiting for initialization")
SystemClock.sleep(1000)
} }
while (true) { private val validProfile = "{\"dia\":\"6\",\"carbratio\":[{\"time\":\"00:00\",\"value\":\"30\"}],\"carbs_hr\":\"20\",\"delay\":\"20\",\"sens\":[{\"time\":\"00:00\",\"value\":\"10\"},{\"time\":\"2:00\",\"value\":\"11\"}],\"timezone\":\"UTC\",\"basal\":[{\"time\":\"00:00\",\"value\":\"0.1\"}],\"target_low\":[{\"time\":\"00:00\",\"value\":\"4\"}],\"target_high\":[{\"time\":\"00:00\",\"value\":\"5\"}],\"startDate\":\"1970-01-01T00:00:00.000Z\",\"units\":\"mmol\"}"
//log.debug("Tick")
SystemClock.sleep(1000) @Inject lateinit var pump : info.nightscout.androidaps.danaRv2.DanaRv2Plugin
@Inject lateinit var randomBgPlugin :RandomBgPlugin
@Inject lateinit var localProfilePlugin: LocalProfilePlugin
@Inject lateinit var profileFunction: ProfileFunction
@Inject lateinit var insulinOrefUltraRapidActingPlugin: InsulinOrefUltraRapidActingPlugin
@Inject lateinit var sensitivityOref1Plugin: SensitivityOref1Plugin
@Inject lateinit var openAPSSMBPlugin: OpenAPSSMBPlugin
@Inject lateinit var loopPlugin: LoopPlugin
@Inject lateinit var actionsPlugin: ActionsPlugin
@Inject lateinit var configBuilderPlugin: ConfigBuilderPlugin
@Inject lateinit var objectivesPlugin: ObjectivesPlugin
@Inject lateinit var treatmentsPlugin: TreatmentsPlugin
@Inject lateinit var sp: SP
@Rule
@JvmField
var mActivityTestRule = ActivityTestRule(MainActivity::class.java)
@Rule
@JvmField
var mGrantPermissionRule: GrantPermissionRule =
GrantPermissionRule.grant(
android.Manifest.permission.ACCESS_FINE_LOCATION,
android.Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE
)
@Before
fun clear() {
sp.clear()
sp.putBoolean(R.string.key_setupwizard_processed, true)
sp.putString(R.string.key_aps_mode, "closed")
MainApp.getDbHelper().resetDatabases()
MainApp.devBranch = false
} }
}
*/ private fun preparePlugins() {
// Source
configBuilderPlugin.performPluginSwitch(randomBgPlugin,true, PluginType.BGSOURCE)
// Profile
configBuilderPlugin.performPluginSwitch(localProfilePlugin, true, PluginType.PROFILE)
val profile = Profile(JSONObject(validProfile), GlucoseUnit.MGDL.asText)
Assert.assertTrue(profile.isValid("Test"))
localProfilePlugin.profiles.clear()
localProfilePlugin.numOfProfiles = 0
val singleProfile = LocalProfilePlugin.SingleProfile().copyFrom(localProfilePlugin.rawProfile, profile, "TestProfile")
localProfilePlugin.addProfile(singleProfile)
val profileSwitch = profileFunction.prepareProfileSwitch(localProfilePlugin.createProfileStore(), "TestProfile", 0, 100, 0, dateUtil._now())
treatmentsPlugin.addToHistoryProfileSwitch(profileSwitch)
// Insulin
configBuilderPlugin.performPluginSwitch(insulinOrefUltraRapidActingPlugin, true, PluginType.INSULIN)
// Pump
sp.putInt(R.string.key_danar_password, R_PASSWORD)
sp.putString(R.string.key_danar_bt_name, R_SERIAL)
configBuilderPlugin.performPluginSwitch((pump as PluginBase), true, PluginType.PUMP)
// Sensitivity
configBuilderPlugin.performPluginSwitch(sensitivityOref1Plugin, true, PluginType.SENSITIVITY)
// APS
configBuilderPlugin.performPluginSwitch(openAPSSMBPlugin, true, PluginType.APS)
configBuilderPlugin.performPluginSwitch(loopPlugin, true, PluginType.LOOP)
// Enable common
configBuilderPlugin.performPluginSwitch(actionsPlugin, true, )
// Disable unneeded
MainApp.getPluginsList().remove(objectivesPlugin)
}
@Test
fun doTest() {
Assert.assertTrue(isRunningTest())
preparePlugins()
while (!pump.isInitialized) {
//log.debug("Waiting for initialization")
SystemClock.sleep(1000)
}
while (true) {
//log.debug("Tick")
SystemClock.sleep(1000)
}
}
*/
} }

View file

@ -1,195 +1,191 @@
package info.nightscout.androidaps package info.nightscout.androidaps
import androidx.test.ext.junit.runners.AndroidJUnit4 //@LargeTest
import androidx.test.filters.LargeTest //@RunWith(AndroidJUnit4::class)
import org.junit.runner.RunWith
@LargeTest
@RunWith(AndroidJUnit4::class)
class SetupWizardActivityTest { class SetupWizardActivityTest {
/* /*
@Rule @Rule
@JvmField @JvmField
var mActivityTestRule = ActivityTestRule(SetupWizardActivity::class.java) var mActivityTestRule = ActivityTestRule(SetupWizardActivity::class.java)
@Rule @Rule
@JvmField @JvmField
var mGrantPermissionRule: GrantPermissionRule = var mGrantPermissionRule: GrantPermissionRule =
GrantPermissionRule.grant( GrantPermissionRule.grant(
android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION,
android.Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS, android.Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE android.Manifest.permission.WRITE_EXTERNAL_STORAGE
) )
@Before @Before
fun clear() { fun clear() {
sp.clear() sp.clear()
}
/*
To run from command line
gradlew connectedFullDebugAndroidTest
do not run when your production phone is connected !!!
do this before for running in emulator
adb shell settings put global window_animation_scale 0 &
adb shell settings put global transition_animation_scale 0 &
adb shell settings put global animator_duration_scale 0 &
*/
@Test
fun setupWizardActivityTest() {
sp.clear()
Assert.assertTrue(isRunningTest())
// Welcome page
onView(withId(R.id.next_button)).perform(click())
// Language selection
onView(withText("English")).perform(scrollTo(), click())
onView(withId(R.id.next_button)).waitAndPerform(click())
// Agreement page
onView(withText("I UNDERSTAND AND AGREE")).perform(scrollTo(), click())
onView(withId(R.id.next_button)).waitAndPerform(click())
// Location permission
var askButton = onView(withText("Ask for permission"))
if (askButton.isDisplayed()) {
askButton.perform(scrollTo(), click())
onView(withId(R.id.next_button)).waitAndPerform(click())
} }
// Store permission /*
askButton = onView(withText("Ask for permission"))
if (askButton.isDisplayed()) { To run from command line
askButton.perform(scrollTo(), click()) gradlew connectedFullDebugAndroidTest
onView(withText("OK")).perform(click())
do not run when your production phone is connected !!!
do this before for running in emulator
adb shell settings put global window_animation_scale 0 &
adb shell settings put global transition_animation_scale 0 &
adb shell settings put global animator_duration_scale 0 &
*/
@Test
fun setupWizardActivityTest() {
sp.clear()
Assert.assertTrue(isRunningTest())
// Welcome page
onView(withId(R.id.next_button)).perform(click())
// Language selection
onView(withText("English")).perform(scrollTo(), click())
onView(withId(R.id.next_button)).waitAndPerform(click()) onView(withId(R.id.next_button)).waitAndPerform(click())
} // Agreement page
// Import settings : skip of found onView(withText("I UNDERSTAND AND AGREE")).perform(scrollTo(), click())
askButton = onView(withText("IMPORT SETTINGS"))
if (askButton.isDisplayed()) {
onView(withId(R.id.next_button)).waitAndPerform(click()) onView(withId(R.id.next_button)).waitAndPerform(click())
} // Location permission
// Units selection var askButton = onView(withText("Ask for permission"))
onView(withText("mmol/L")).perform(scrollTo(), click()) if (askButton.isDisplayed()) {
onView(withId(R.id.next_button)).perform(click()) askButton.perform(scrollTo(), click())
// Display target selection onView(withId(R.id.next_button)).waitAndPerform(click())
onView(withText("4.2")).perform(scrollTo(), ViewActions.replaceText("5")) }
onView(withText("10.0")).perform(scrollTo(), ViewActions.replaceText("11")) // Store permission
onView(withId(R.id.next_button)).perform(click()) askButton = onView(withText("Ask for permission"))
// NSClient if (askButton.isDisplayed()) {
onView(withId(R.id.next_button)).perform(click()) askButton.perform(scrollTo(), click())
// Age selection onView(withText("OK")).perform(click())
onView(withText("Adult")).perform(scrollTo(), click()) onView(withId(R.id.next_button)).waitAndPerform(click())
onView(withId(R.id.next_button)).waitAndPerform(click()) }
// Insulin selection // Import settings : skip of found
onView(withText("Ultra-Rapid Oref")).perform(scrollTo(), click()) askButton = onView(withText("IMPORT SETTINGS"))
onView(withId(R.id.next_button)).waitAndPerform(click()) if (askButton.isDisplayed()) {
// BG source selection onView(withId(R.id.next_button)).waitAndPerform(click())
onView(withText("Random BG")).perform(scrollTo(), click()) }
onView(withId(R.id.next_button)).waitAndPerform(click()) // Units selection
// Profile selection onView(withText("mmol/L")).perform(scrollTo(), click())
onView(withText("Local Profile")).perform(scrollTo(), click()) onView(withId(R.id.next_button)).perform(click())
onView(withId(R.id.next_button)).waitAndPerform(click()) // Display target selection
// Local profile - DIA onView(withText("4.2")).perform(scrollTo(), ViewActions.replaceText("5"))
onView(withTagValue(Matchers.`is`("LP_DIA"))).perform(scrollTo(), ViewActions.replaceText("6.0")) onView(withText("10.0")).perform(scrollTo(), ViewActions.replaceText("11"))
// Local profile - IC onView(withId(R.id.next_button)).perform(click())
onView(withId(R.id.ic_tab)).perform(scrollTo(), click()) // NSClient
onView(Matchers.allOf(withTagValue(Matchers.`is`("IC-1-0")), isDisplayed())) onView(withId(R.id.next_button)).perform(click())
.perform(ViewActions.replaceText("2"), ViewActions.closeSoftKeyboard()) // Age selection
// Local profile - ISF onView(withText("Adult")).perform(scrollTo(), click())
onView(withId(R.id.isf_tab)).perform(scrollTo(), click()) onView(withId(R.id.next_button)).waitAndPerform(click())
onView(Matchers.allOf(withTagValue(Matchers.`is`("ISF-1-0")), isDisplayed())) // Insulin selection
.perform(ViewActions.replaceText("3"), ViewActions.closeSoftKeyboard()) onView(withText("Ultra-Rapid Oref")).perform(scrollTo(), click())
// Local profile - BAS onView(withId(R.id.next_button)).waitAndPerform(click())
onView(withId(R.id.basal_tab)).perform(scrollTo(), click()) // BG source selection
onView(childAtPosition(Matchers.allOf(withId(R.id.localprofile_basal), childAtPosition(withClassName(Matchers.`is`("android.widget.LinearLayout")), 6)), 2)) onView(withText("Random BG")).perform(scrollTo(), click())
.perform(scrollTo(), click()) onView(withId(R.id.next_button)).waitAndPerform(click())
onView(Matchers.allOf(withTagValue(Matchers.`is`("BASAL-1-0")), isDisplayed())) // Profile selection
.perform(ViewActions.replaceText("1.1"), ViewActions.closeSoftKeyboard()) onView(withText("Local Profile")).perform(scrollTo(), click())
onView(Matchers.allOf(withTagValue(Matchers.`is`("BASAL-1-1")), isDisplayed())) onView(withId(R.id.next_button)).waitAndPerform(click())
.perform(ViewActions.replaceText("1.2"), ViewActions.closeSoftKeyboard()) // Local profile - DIA
onView(Matchers.allOf(withId(R.id.timelistedit_time), childAtPosition(childAtPosition(withId(R.id.localprofile_basal), 2), 0))) onView(withTagValue(Matchers.`is`("LP_DIA"))).perform(scrollTo(), ViewActions.replaceText("6.0"))
.perform(scrollTo(), click()) // Local profile - IC
onData(Matchers.anything()).inAdapterView(childAtPosition(withClassName(Matchers.`is`("android.widget.PopupWindow\$PopupBackgroundView")), 0)).atPosition(13) onView(withId(R.id.ic_tab)).perform(scrollTo(), click())
.perform(click()) onView(Matchers.allOf(withTagValue(Matchers.`is`("IC-1-0")), isDisplayed()))
// Local profile - TARGET .perform(ViewActions.replaceText("2"), ViewActions.closeSoftKeyboard())
onView(withId(R.id.target_tab)).perform(scrollTo(), click()) // Local profile - ISF
onView(Matchers.allOf(withTagValue(Matchers.`is`("TARGET-1-0")), isDisplayed())) onView(withId(R.id.isf_tab)).perform(scrollTo(), click())
.perform(ViewActions.replaceText("6"), ViewActions.closeSoftKeyboard()) onView(Matchers.allOf(withTagValue(Matchers.`is`("ISF-1-0")), isDisplayed()))
onView(Matchers.allOf(withTagValue(Matchers.`is`("TARGET-2-0")), isDisplayed())) .perform(ViewActions.replaceText("3"), ViewActions.closeSoftKeyboard())
.perform(ViewActions.replaceText("6.5"), ViewActions.closeSoftKeyboard()) // Local profile - BAS
onView(withText("Save")).perform(scrollTo(), click()) onView(withId(R.id.basal_tab)).perform(scrollTo(), click())
onView(Matchers.allOf(withId(R.id.localprofile_profileswitch), isDisplayed())) onView(childAtPosition(Matchers.allOf(withId(R.id.localprofile_basal), childAtPosition(withClassName(Matchers.`is`("android.widget.LinearLayout")), 6)), 2))
.perform(scrollTo(), click()) .perform(scrollTo(), click())
onView(allOf(withId(R.id.ok), isDisplayed())).perform(click()) onView(Matchers.allOf(withTagValue(Matchers.`is`("BASAL-1-0")), isDisplayed()))
// confirm dialog .perform(ViewActions.replaceText("1.1"), ViewActions.closeSoftKeyboard())
//onView(Matchers.allOf(withText("OK"), isDisplayed())).perform(click()) not working on real phone onView(Matchers.allOf(withTagValue(Matchers.`is`("BASAL-1-1")), isDisplayed()))
clickOkInDialog() .perform(ViewActions.replaceText("1.2"), ViewActions.closeSoftKeyboard())
onView(withId(R.id.next_button)).waitAndPerform(click()) onView(Matchers.allOf(withId(R.id.timelistedit_time), childAtPosition(childAtPosition(withId(R.id.localprofile_basal), 2), 0)))
// Profile switch .perform(scrollTo(), click())
askButton = onView(withText("Do Profile Switch")) onData(Matchers.anything()).inAdapterView(childAtPosition(withClassName(Matchers.`is`("android.widget.PopupWindow\$PopupBackgroundView")), 0)).atPosition(13)
if (askButton.isDisplayed()) { .perform(click())
askButton.perform(scrollTo(), click()) // Local profile - TARGET
onView(withId(R.id.target_tab)).perform(scrollTo(), click())
onView(Matchers.allOf(withTagValue(Matchers.`is`("TARGET-1-0")), isDisplayed()))
.perform(ViewActions.replaceText("6"), ViewActions.closeSoftKeyboard())
onView(Matchers.allOf(withTagValue(Matchers.`is`("TARGET-2-0")), isDisplayed()))
.perform(ViewActions.replaceText("6.5"), ViewActions.closeSoftKeyboard())
onView(withText("Save")).perform(scrollTo(), click())
onView(Matchers.allOf(withId(R.id.localprofile_profileswitch), isDisplayed()))
.perform(scrollTo(), click())
onView(allOf(withId(R.id.ok), isDisplayed())).perform(click()) onView(allOf(withId(R.id.ok), isDisplayed())).perform(click())
// onView(Matchers.allOf(withText("OK"), isDisplayed())).perform(click()) not working on real phone // confirm dialog
//onView(Matchers.allOf(withText("OK"), isDisplayed())).perform(click()) not working on real phone
clickOkInDialog() clickOkInDialog()
while (ProfileFunctions.getInstance().profile == null) SystemClock.sleep(100)
onView(withId(R.id.next_button)).waitAndPerform(click()) onView(withId(R.id.next_button)).waitAndPerform(click())
} // Profile switch
// Pump askButton = onView(withText("Do Profile Switch"))
onView(withText("Virtual Pump")).perform(scrollTo(), click()) if (askButton.isDisplayed()) {
onView(withId(R.id.next_button)).waitAndPerform(click()) askButton.perform(scrollTo(), click())
// APS onView(allOf(withId(R.id.ok), isDisplayed())).perform(click())
onView(withText("OpenAPS SMB")).perform(scrollTo(), click()) // onView(Matchers.allOf(withText("OK"), isDisplayed())).perform(click()) not working on real phone
onView(withId(R.id.next_button)).waitAndPerform(click()) clickOkInDialog()
// Open Closed Loop while (ProfileFunctions.getInstance().profile == null) SystemClock.sleep(100)
onView(withText("Closed Loop")).perform(scrollTo(), click()) onView(withId(R.id.next_button)).waitAndPerform(click())
onView(withId(R.id.next_button)).waitAndPerform(click())
// Loop
askButton = onView(withText("Enable loop"))
if (askButton.isDisplayed()) {
askButton.perform(scrollTo(), click())
onView(withId(R.id.next_button)).waitAndPerform(click())
}
// Sensitivity
onView(withText("Sensitivity Oref1")).perform(scrollTo(), click())
onView(withId(R.id.next_button)).waitAndPerform(click())
// Objectives
onView(allOf(withText("Start"), isDisplayed())).perform(scrollTo(), click())
onView(withId(R.id.finish_button)).waitAndPerform(click())
// Verify settings
Assert.assertEquals(Constants.MMOL, ProfileFunctions.getSystemUnits())
Assert.assertEquals(17.0, HardLimits.maxBolus(), 0.0001) // Adult
Assert.assertTrue(RandomBgPlugin.isEnabled(PluginType.BGSOURCE))
Assert.assertTrue(LocalProfilePlugin.isEnabled(PluginType.PROFILE))
val p = ProfileFunctions.getInstance().profile
Assert.assertNotNull(p)
Assert.assertEquals(2.0, p!!.ic, 0.0001)
Assert.assertEquals(3.0 * Constants.MMOLL_TO_MGDL, p.isfMgdl, 0.0001)
Assert.assertEquals(1.1, p.getBasalTimeFromMidnight(0), 0.0001)
Assert.assertEquals(6.0 * Constants.MMOLL_TO_MGDL, p.targetLowMgdl, 0.0001)
Assert.assertTrue(VirtualPumpPlugin.getPlugin().isEnabled(PluginType.PUMP))
Assert.assertTrue(OpenAPSSMBPlugin.getPlugin().isEnabled())
Assert.assertTrue(LoopPlugin.getPlugin().isEnabled(PluginType.LOOP))
Assert.assertTrue(SensitivityOref1Plugin.getPlugin().isEnabled(PluginType.SENSITIVITY))
Assert.assertTrue(ObjectivesPlugin.objectives[0].isStarted)
}
private fun childAtPosition(
parentMatcher: Matcher<View>, position: Int): Matcher<View> {
return object : TypeSafeMatcher<View>() {
override fun describeTo(description: Description) {
description.appendText("Child at position $position in parent ")
parentMatcher.describeTo(description)
} }
// Pump
onView(withText("Virtual Pump")).perform(scrollTo(), click())
onView(withId(R.id.next_button)).waitAndPerform(click())
// APS
onView(withText("OpenAPS SMB")).perform(scrollTo(), click())
onView(withId(R.id.next_button)).waitAndPerform(click())
// Open Closed Loop
onView(withText("Closed Loop")).perform(scrollTo(), click())
onView(withId(R.id.next_button)).waitAndPerform(click())
// Loop
askButton = onView(withText("Enable loop"))
if (askButton.isDisplayed()) {
askButton.perform(scrollTo(), click())
onView(withId(R.id.next_button)).waitAndPerform(click())
}
// Sensitivity
onView(withText("Sensitivity Oref1")).perform(scrollTo(), click())
onView(withId(R.id.next_button)).waitAndPerform(click())
// Objectives
onView(allOf(withText("Start"), isDisplayed())).perform(scrollTo(), click())
onView(withId(R.id.finish_button)).waitAndPerform(click())
public override fun matchesSafely(view: View): Boolean { // Verify settings
val parent = view.parent Assert.assertEquals(GlucoseUnit.MMOL.asText, ProfileFunctions.getSystemUnits())
return parent is ViewGroup && parentMatcher.matches(parent) Assert.assertEquals(17.0, HardLimits.maxBolus(), 0.0001) // Adult
&& view == parent.getChildAt(position) Assert.assertTrue(RandomBgPlugin.isEnabled(PluginType.BGSOURCE))
Assert.assertTrue(LocalProfilePlugin.isEnabled(PluginType.PROFILE))
val p = ProfileFunctions.getInstance().profile
Assert.assertNotNull(p)
Assert.assertEquals(2.0, p!!.ic, 0.0001)
Assert.assertEquals(3.0 * Constants.MMOLL_TO_MGDL, p.isfMgdl, 0.0001)
Assert.assertEquals(1.1, p.getBasalTimeFromMidnight(0), 0.0001)
Assert.assertEquals(6.0 * Constants.MMOLL_TO_MGDL, p.targetLowMgdl, 0.0001)
Assert.assertTrue(VirtualPumpPlugin.getPlugin().isEnabled(PluginType.PUMP))
Assert.assertTrue(OpenAPSSMBPlugin.getPlugin().isEnabled())
Assert.assertTrue(LoopPlugin.getPlugin().isEnabled(PluginType.LOOP))
Assert.assertTrue(SensitivityOref1Plugin.getPlugin().isEnabled(PluginType.SENSITIVITY))
Assert.assertTrue(ObjectivesPlugin.objectives[0].isStarted)
}
private fun childAtPosition(
parentMatcher: Matcher<View>, position: Int): Matcher<View> {
return object : TypeSafeMatcher<View>() {
override fun describeTo(description: Description) {
description.appendText("Child at position $position in parent ")
parentMatcher.describeTo(description)
}
public override fun matchesSafely(view: View): Boolean {
val parent = view.parent
return parent is ViewGroup && parentMatcher.matches(parent)
&& view == parent.getChildAt(position)
}
} }
} }
} */
*/
} }

View file

@ -52,11 +52,10 @@ import info.nightscout.database.entities.UserEntry.Sources
import info.nightscout.interfaces.AndroidPermission import info.nightscout.interfaces.AndroidPermission
import info.nightscout.interfaces.Config import info.nightscout.interfaces.Config
import info.nightscout.interfaces.aps.Loop import info.nightscout.interfaces.aps.Loop
import info.nightscout.interfaces.constraints.Constraints import info.nightscout.interfaces.constraints.ConstraintsChecker
import info.nightscout.interfaces.logging.UserEntryLogger import info.nightscout.interfaces.logging.UserEntryLogger
import info.nightscout.interfaces.maintenance.PrefFileListProvider import info.nightscout.interfaces.maintenance.PrefFileListProvider
import info.nightscout.interfaces.plugin.ActivePlugin import info.nightscout.interfaces.plugin.ActivePlugin
import info.nightscout.interfaces.plugin.PluginBase
import info.nightscout.interfaces.profile.ProfileFunction import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.interfaces.protection.ProtectionCheck import info.nightscout.interfaces.protection.ProtectionCheck
import info.nightscout.interfaces.smsCommunicator.SmsCommunicator import info.nightscout.interfaces.smsCommunicator.SmsCommunicator
@ -96,7 +95,7 @@ class MainActivity : DaggerAppCompatActivityWithResult() {
@Inject lateinit var fabricPrivacy: FabricPrivacy @Inject lateinit var fabricPrivacy: FabricPrivacy
@Inject lateinit var protectionCheck: ProtectionCheck @Inject lateinit var protectionCheck: ProtectionCheck
@Inject lateinit var iconsProvider: IconsProvider @Inject lateinit var iconsProvider: IconsProvider
@Inject lateinit var constraintChecker: Constraints @Inject lateinit var constraintChecker: ConstraintsChecker
@Inject lateinit var signatureVerifierPlugin: SignatureVerifierPlugin @Inject lateinit var signatureVerifierPlugin: SignatureVerifierPlugin
@Inject lateinit var uel: UserEntryLogger @Inject lateinit var uel: UserEntryLogger
@Inject lateinit var profileFunction: ProfileFunction @Inject lateinit var profileFunction: ProfileFunction
@ -283,7 +282,7 @@ class MainActivity : DaggerAppCompatActivityWithResult() {
private fun start() { private fun start() {
binding.splash.visibility = View.GONE binding.splash.visibility = View.GONE
//Check here if loop plugin is disabled. Else check via constraints //Check here if loop plugin is disabled. Else check via constraints
if (!(loop as PluginBase).isEnabled()) versionCheckerUtils.triggerCheckVersion() if (!loop.isEnabled()) versionCheckerUtils.triggerCheckVersion()
setUserStats() setUserStats()
setupViews() setupViews()

View file

@ -38,6 +38,7 @@ import info.nightscout.interfaces.notifications.Notification
import info.nightscout.interfaces.plugin.PluginBase import info.nightscout.interfaces.plugin.PluginBase
import info.nightscout.interfaces.ui.UiInteraction import info.nightscout.interfaces.ui.UiInteraction
import info.nightscout.interfaces.versionChecker.VersionCheckerUtils import info.nightscout.interfaces.versionChecker.VersionCheckerUtils
import info.nightscout.plugins.aps.utils.StaticInjector
import info.nightscout.plugins.general.overview.notifications.NotificationStore import info.nightscout.plugins.general.overview.notifications.NotificationStore
import info.nightscout.plugins.general.themes.ThemeSwitcherPlugin import info.nightscout.plugins.general.themes.ThemeSwitcherPlugin
import info.nightscout.rx.logging.AAPSLogger import info.nightscout.rx.logging.AAPSLogger
@ -77,7 +78,7 @@ class MainApp : DaggerApplication() {
@Inject lateinit var compatDBHelper: CompatDBHelper @Inject lateinit var compatDBHelper: CompatDBHelper
@Inject lateinit var repository: AppRepository @Inject lateinit var repository: AppRepository
@Inject lateinit var dateUtil: DateUtil @Inject lateinit var dateUtil: DateUtil
@Suppress("unused") @Inject lateinit var staticInjector: info.nightscout.plugins.aps.utils.StaticInjector// TODO avoid , here fake only to initialize @Suppress("unused") @Inject lateinit var staticInjector: StaticInjector// TODO avoid , here fake only to initialize
@Inject lateinit var uel: UserEntryLogger @Inject lateinit var uel: UserEntryLogger
@Inject lateinit var uiInteraction: UiInteraction @Inject lateinit var uiInteraction: UiInteraction
@Inject lateinit var notificationStore: NotificationStore @Inject lateinit var notificationStore: NotificationStore

View file

@ -8,7 +8,6 @@ import info.nightscout.androidaps.MainApp
import info.nightscout.androidaps.danar.di.DanaRModule import info.nightscout.androidaps.danar.di.DanaRModule
import info.nightscout.androidaps.insight.di.InsightDatabaseModule import info.nightscout.androidaps.insight.di.InsightDatabaseModule
import info.nightscout.androidaps.insight.di.InsightModule import info.nightscout.androidaps.insight.di.InsightModule
import info.nightscout.plugins.sync.di.OpenHumansModule
import info.nightscout.androidaps.plugins.pump.common.di.RileyLinkModule import info.nightscout.androidaps.plugins.pump.common.di.RileyLinkModule
import info.nightscout.androidaps.plugins.pump.eopatch.dagger.EopatchModule import info.nightscout.androidaps.plugins.pump.eopatch.dagger.EopatchModule
import info.nightscout.androidaps.plugins.pump.medtronic.di.MedtronicModule import info.nightscout.androidaps.plugins.pump.medtronic.di.MedtronicModule
@ -24,6 +23,7 @@ import info.nightscout.insulin.di.InsulinModule
import info.nightscout.plugins.aps.di.ApsModule import info.nightscout.plugins.aps.di.ApsModule
import info.nightscout.plugins.constraints.di.PluginsConstraintsModule import info.nightscout.plugins.constraints.di.PluginsConstraintsModule
import info.nightscout.plugins.di.PluginsModule import info.nightscout.plugins.di.PluginsModule
import info.nightscout.plugins.sync.di.OpenHumansModule
import info.nightscout.plugins.sync.di.SyncModule import info.nightscout.plugins.sync.di.SyncModule
import info.nightscout.pump.combo.di.ComboModule import info.nightscout.pump.combo.di.ComboModule
import info.nightscout.pump.combov2.di.ComboV2Module import info.nightscout.pump.combov2.di.ComboV2Module
@ -31,11 +31,9 @@ import info.nightscout.pump.common.di.PumpCommonModule
import info.nightscout.pump.dana.di.DanaHistoryModule import info.nightscout.pump.dana.di.DanaHistoryModule
import info.nightscout.pump.dana.di.DanaModule import info.nightscout.pump.dana.di.DanaModule
import info.nightscout.pump.danars.di.DanaRSModule import info.nightscout.pump.danars.di.DanaRSModule
import info.nightscout.pump.medtrum.di.MedtrumModule
import info.nightscout.pump.diaconn.di.DiaconnG8Module import info.nightscout.pump.diaconn.di.DiaconnG8Module
import info.nightscout.pump.medtrum.di.MedtrumModule
import info.nightscout.pump.virtual.di.VirtualPumpModule import info.nightscout.pump.virtual.di.VirtualPumpModule
import info.nightscout.rx.di.RxModule
import info.nightscout.shared.di.SharedModule
import info.nightscout.shared.impl.di.SharedImplModule import info.nightscout.shared.impl.di.SharedImplModule
import info.nightscout.source.di.SourceModule import info.nightscout.source.di.SourceModule
import info.nightscout.ui.di.UiModule import info.nightscout.ui.di.UiModule
@ -62,8 +60,6 @@ import javax.inject.Singleton
InsulinModule::class, InsulinModule::class,
OpenHumansModule::class, OpenHumansModule::class,
PluginsModule::class, PluginsModule::class,
RxModule::class,
SharedModule::class,
SharedImplModule::class, SharedImplModule::class,
UiModule::class, UiModule::class,
ValidatorsModule::class, ValidatorsModule::class,

View file

@ -1,2 +0,0 @@
package info.nightscout.androidaps.di

View file

@ -10,7 +10,6 @@ import androidx.work.WorkQuery
import androidx.work.WorkerParameters import androidx.work.WorkerParameters
import androidx.work.workDataOf import androidx.work.workDataOf
import com.google.common.util.concurrent.ListenableFuture import com.google.common.util.concurrent.ListenableFuture
import info.nightscout.androidaps.BuildConfig
import info.nightscout.androidaps.R import info.nightscout.androidaps.R
import info.nightscout.configuration.maintenance.MaintenancePlugin import info.nightscout.configuration.maintenance.MaintenancePlugin
import info.nightscout.core.profile.ProfileSealed import info.nightscout.core.profile.ProfileSealed
@ -19,13 +18,11 @@ import info.nightscout.database.impl.AppRepository
import info.nightscout.interfaces.Config import info.nightscout.interfaces.Config
import info.nightscout.interfaces.LocalAlertUtils import info.nightscout.interfaces.LocalAlertUtils
import info.nightscout.interfaces.aps.Loop import info.nightscout.interfaces.aps.Loop
import info.nightscout.interfaces.configBuilder.RunningConfiguration
import info.nightscout.interfaces.iob.IobCobCalculator import info.nightscout.interfaces.iob.IobCobCalculator
import info.nightscout.interfaces.plugin.ActivePlugin import info.nightscout.interfaces.plugin.ActivePlugin
import info.nightscout.interfaces.profile.ProfileFunction import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.interfaces.queue.Command import info.nightscout.interfaces.queue.Command
import info.nightscout.interfaces.queue.CommandQueue import info.nightscout.interfaces.queue.CommandQueue
import info.nightscout.interfaces.receivers.ReceiverStatusStore
import info.nightscout.rx.bus.RxBus import info.nightscout.rx.bus.RxBus
import info.nightscout.rx.events.EventProfileSwitchChanged import info.nightscout.rx.events.EventProfileSwitchChanged
import info.nightscout.rx.logging.LTag import info.nightscout.rx.logging.LTag
@ -51,8 +48,6 @@ class KeepAliveWorker(
@Inject lateinit var dateUtil: DateUtil @Inject lateinit var dateUtil: DateUtil
@Inject lateinit var activePlugin: ActivePlugin @Inject lateinit var activePlugin: ActivePlugin
@Inject lateinit var profileFunction: ProfileFunction @Inject lateinit var profileFunction: ProfileFunction
@Inject lateinit var runningConfiguration: RunningConfiguration
@Inject lateinit var receiverStatusStore: ReceiverStatusStore
@Inject lateinit var rxBus: RxBus @Inject lateinit var rxBus: RxBus
@Inject lateinit var commandQueue: CommandQueue @Inject lateinit var commandQueue: CommandQueue
@Inject lateinit var maintenancePlugin: MaintenancePlugin @Inject lateinit var maintenancePlugin: MaintenancePlugin
@ -155,13 +150,7 @@ class KeepAliveWorker(
else if (dateUtil.isOlderThan(activePlugin.activeAPS.lastAPSRun, 5)) shouldUploadStatus = true else if (dateUtil.isOlderThan(activePlugin.activeAPS.lastAPSRun, 5)) shouldUploadStatus = true
if (dateUtil.isOlderThan(lastIobUpload, IOB_UPDATE_FREQUENCY_IN_MINUTES) && shouldUploadStatus) { if (dateUtil.isOlderThan(lastIobUpload, IOB_UPDATE_FREQUENCY_IN_MINUTES) && shouldUploadStatus) {
lastIobUpload = dateUtil.now() lastIobUpload = dateUtil.now()
loop.buildDeviceStatus( loop.buildAndStoreDeviceStatus()
dateUtil, loop, iobCobCalculator, profileFunction,
activePlugin.activePump, receiverStatusStore, runningConfiguration,
BuildConfig.VERSION_NAME + "-" + BuildConfig.BUILDVERSION
)?.also {
repository.insert(it)
}
} }
} }
@ -193,8 +182,8 @@ class KeepAliveWorker(
// do nothing if pump is disconnected // do nothing if pump is disconnected
} else if (runningProfile == null || ((!pump.isThisProfileSet(requestedProfile) || !requestedProfile.isEqual(runningProfile) } else if (runningProfile == null || ((!pump.isThisProfileSet(requestedProfile) || !requestedProfile.isEqual(runningProfile)
|| (runningProfile is ProfileSealed.EPS && runningProfile.value.originalEnd < dateUtil.now() && runningProfile.value.originalDuration != 0L)) || (runningProfile is ProfileSealed.EPS && runningProfile.value.originalEnd < dateUtil.now() && runningProfile.value.originalDuration != 0L))
&& !commandQueue.isRunning(Command.CommandType.BASAL_PROFILE))) && !commandQueue.isRunning(Command.CommandType.BASAL_PROFILE))
{ ) {
rxBus.send(EventProfileSwitchChanged()) rxBus.send(EventProfileSwitchChanged())
} else if (isStatusOutdated && !pump.isBusy()) { } else if (isStatusOutdated && !pump.isBusy()) {
lastReadStatus = now lastReadStatus = now

View file

@ -121,12 +121,12 @@ class CalculationWorkflowImpl @Inject constructor(
} }
override fun stopCalculation(job: String, from: String) { override fun stopCalculation(job: String, from: String) {
aapsLogger.debug(LTag.AUTOSENS, "Stopping calculation thread: $from") aapsLogger.debug(LTag.WORKER, "Stopping calculation thread: $from")
WorkManager.getInstance(context).cancelUniqueWork(job) WorkManager.getInstance(context).cancelUniqueWork(job)
val workStatus = WorkManager.getInstance(context).getWorkInfosForUniqueWork(job).get() val workStatus = WorkManager.getInstance(context).getWorkInfosForUniqueWork(job).get()
while (workStatus.size >= 1 && workStatus[0].state == WorkInfo.State.RUNNING) while (workStatus.size >= 1 && workStatus[0].state == WorkInfo.State.RUNNING)
SystemClock.sleep(100) SystemClock.sleep(100)
aapsLogger.debug(LTag.AUTOSENS, "Calculation thread stopped: $from") aapsLogger.debug(LTag.WORKER, "Calculation thread stopped: $from")
} }
override fun runCalculation( override fun runCalculation(
@ -138,7 +138,7 @@ class CalculationWorkflowImpl @Inject constructor(
bgDataReload: Boolean, bgDataReload: Boolean,
cause: Event? cause: Event?
) { ) {
aapsLogger.debug(LTag.AUTOSENS, "Starting calculation worker: $reason to ${dateUtil.dateAndTimeAndSecondsString(end)}") aapsLogger.debug(LTag.WORKER, "Starting calculation worker: $reason to ${dateUtil.dateAndTimeAndSecondsString(end)}")
WorkManager.getInstance(context) WorkManager.getInstance(context)
.beginUniqueWork( .beginUniqueWork(

View file

@ -11,6 +11,7 @@
<string name="save">Сохранить</string> <string name="save">Сохранить</string>
<string name="reloadprofile">обновить профиль</string> <string name="reloadprofile">обновить профиль</string>
<string name="correctionbous">Коррекция</string> <string name="correctionbous">Коррекция</string>
<string name="ns_upload_only">(ОТКЛЮЧЕНИЕ ОПАСНО) Только загрузка в NS</string>
<string name="ns_upload_only_summary">Только загрузка в NS (синхронизация отключена). Не влияет на данные мониторинга если не выбран локальный источник, такой как xDrip. Профили, иные чем профиль NS не действуют.\n!!! ПРЕДУПРЕЖДЕНИЕ !!! Отключение этой опции может привести к сбою и передозировке инсулина, если какой-либо из компонентов (AAPS, NS, xDrip) настроен неправильно. Внимательно следите за тем, чтобы данные соответствовали состоянию помпы!</string> <string name="ns_upload_only_summary">Только загрузка в NS (синхронизация отключена). Не влияет на данные мониторинга если не выбран локальный источник, такой как xDrip. Профили, иные чем профиль NS не действуют.\n!!! ПРЕДУПРЕЖДЕНИЕ !!! Отключение этой опции может привести к сбою и передозировке инсулина, если какой-либо из компонентов (AAPS, NS, xDrip) настроен неправильно. Внимательно следите за тем, чтобы данные соответствовали состоянию помпы!</string>
<string name="wear">Смарт-часы Wear</string> <string name="wear">Смарт-часы Wear</string>
<string name="nav_about">о приложении</string> <string name="nav_about">о приложении</string>

View file

@ -2,14 +2,14 @@ package info.nightscout.plugins.aps.loop
import android.app.NotificationManager import android.app.NotificationManager
import android.content.Context import android.content.Context
import com.google.common.truth.Truth.assertThat
import dagger.android.AndroidInjector import dagger.android.AndroidInjector
import dagger.android.HasAndroidInjector import dagger.android.HasAndroidInjector
import info.nightscout.core.utils.fabric.FabricPrivacy import info.nightscout.core.utils.fabric.FabricPrivacy
import info.nightscout.database.impl.AppRepository import info.nightscout.database.impl.AppRepository
import info.nightscout.interfaces.ApsMode import info.nightscout.interfaces.ApsMode
import info.nightscout.interfaces.Config import info.nightscout.interfaces.Config
import info.nightscout.interfaces.configBuilder.RunningConfiguration import info.nightscout.interfaces.constraints.ConstraintsChecker
import info.nightscout.interfaces.constraints.Constraints
import info.nightscout.interfaces.iob.IobCobCalculator import info.nightscout.interfaces.iob.IobCobCalculator
import info.nightscout.interfaces.logging.UserEntryLogger import info.nightscout.interfaces.logging.UserEntryLogger
import info.nightscout.interfaces.plugin.ActivePlugin import info.nightscout.interfaces.plugin.ActivePlugin
@ -20,12 +20,11 @@ import info.nightscout.interfaces.queue.CommandQueue
import info.nightscout.interfaces.receivers.ReceiverStatusStore import info.nightscout.interfaces.receivers.ReceiverStatusStore
import info.nightscout.interfaces.ui.UiInteraction import info.nightscout.interfaces.ui.UiInteraction
import info.nightscout.pump.virtual.VirtualPumpPlugin import info.nightscout.pump.virtual.VirtualPumpPlugin
import info.nightscout.rx.bus.RxBus import info.nightscout.sdk.interfaces.RunningConfiguration
import info.nightscout.shared.interfaces.ResourceHelper import info.nightscout.shared.interfaces.ResourceHelper
import info.nightscout.shared.sharedPreferences.SP import info.nightscout.shared.sharedPreferences.SP
import info.nightscout.shared.utils.DateUtil import info.nightscout.shared.utils.DateUtil
import info.nightscout.sharedtests.TestBase import info.nightscout.sharedtests.TestBase
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test
import org.mockito.Mock import org.mockito.Mock
@ -34,8 +33,7 @@ import org.mockito.Mockito.`when`
class LoopPluginTest : TestBase() { class LoopPluginTest : TestBase() {
@Mock lateinit var sp: SP @Mock lateinit var sp: SP
private val rxBus: RxBus = RxBus(aapsSchedulers, aapsLogger) @Mock lateinit var constraintChecker: ConstraintsChecker
@Mock lateinit var constraintChecker: Constraints
@Mock lateinit var rh: ResourceHelper @Mock lateinit var rh: ResourceHelper
@Mock lateinit var profileFunction: ProfileFunction @Mock lateinit var profileFunction: ProfileFunction
@Mock lateinit var context: Context @Mock lateinit var context: Context
@ -74,28 +72,28 @@ class LoopPluginTest : TestBase() {
`when`(sp.getString(info.nightscout.core.utils.R.string.key_aps_mode, ApsMode.OPEN.name)).thenReturn(ApsMode.CLOSED.name) `when`(sp.getString(info.nightscout.core.utils.R.string.key_aps_mode, ApsMode.OPEN.name)).thenReturn(ApsMode.CLOSED.name)
val pumpDescription = PumpDescription() val pumpDescription = PumpDescription()
`when`(virtualPumpPlugin.pumpDescription).thenReturn(pumpDescription) `when`(virtualPumpPlugin.pumpDescription).thenReturn(pumpDescription)
Assertions.assertEquals(LoopFragment::class.java.name, loopPlugin.pluginDescription.fragmentClass) assertThat(loopPlugin.pluginDescription.fragmentClass).isEqualTo(LoopFragment::class.java.name)
Assertions.assertEquals(PluginType.LOOP, loopPlugin.getType()) assertThat(loopPlugin.getType()).isEqualTo(PluginType.LOOP)
Assertions.assertEquals("Loop", loopPlugin.name) assertThat(loopPlugin.name).isEqualTo("Loop")
Assertions.assertEquals("LOOP", loopPlugin.nameShort) assertThat(loopPlugin.nameShort).isEqualTo("LOOP")
Assertions.assertEquals(true, loopPlugin.hasFragment()) assertThat(loopPlugin.hasFragment()).isTrue()
Assertions.assertEquals(true, loopPlugin.showInList(PluginType.LOOP)) assertThat(loopPlugin.showInList(PluginType.LOOP)).isTrue()
Assertions.assertEquals(info.nightscout.plugins.aps.R.xml.pref_loop.toLong(), loopPlugin.preferencesId.toLong()) assertThat(loopPlugin.preferencesId.toLong()).isEqualTo(info.nightscout.plugins.aps.R.xml.pref_loop.toLong())
// Plugin is disabled by default // Plugin is disabled by default
Assertions.assertEquals(false, loopPlugin.isEnabled()) assertThat(loopPlugin.isEnabled()).isFalse()
loopPlugin.setPluginEnabled(PluginType.LOOP, true) loopPlugin.setPluginEnabled(PluginType.LOOP, true)
Assertions.assertEquals(true, loopPlugin.isEnabled()) assertThat(loopPlugin.isEnabled()).isTrue()
// No temp basal capable pump should disable plugin // No temp basal capable pump should disable plugin
virtualPumpPlugin.pumpDescription.isTempBasalCapable = false virtualPumpPlugin.pumpDescription.isTempBasalCapable = false
Assertions.assertEquals(false, loopPlugin.isEnabled()) assertThat(loopPlugin.isEnabled()).isFalse()
virtualPumpPlugin.pumpDescription.isTempBasalCapable = true virtualPumpPlugin.pumpDescription.isTempBasalCapable = true
// Fragment is hidden by default // Fragment is hidden by default
Assertions.assertEquals(false, loopPlugin.isFragmentVisible()) assertThat(loopPlugin.isFragmentVisible()).isFalse()
loopPlugin.setFragmentVisible(PluginType.LOOP, true) loopPlugin.setFragmentVisible(PluginType.LOOP, true)
Assertions.assertEquals(true, loopPlugin.isFragmentVisible()) assertThat(loopPlugin.isFragmentVisible()).isTrue()
} }
/* *********** not working /* *********** not working
@ -118,7 +116,7 @@ class LoopPluginTest : TestBase() {
MockedLoopPlugin mockedLoopPlugin = new MockedLoopPlugin(); MockedLoopPlugin mockedLoopPlugin = new MockedLoopPlugin();
Treatment t = new Treatment(); Treatment t = new Treatment();
bus.post(new EventTreatmentChange(t)); bus.post(new EventTreatmentChange(t));
Assertions.assertEquals(true, mockedLoopPlugin.invokeCalled); assertThat(mockedLoopPlugin.invokeCalled).isTrue();
} }
*/ */
} }

View file

@ -8,7 +8,6 @@ import info.nightscout.interfaces.plugin.ActivePlugin
import info.nightscout.interfaces.protection.ProtectionCheck import info.nightscout.interfaces.protection.ProtectionCheck
import info.nightscout.interfaces.pump.PumpSync import info.nightscout.interfaces.pump.PumpSync
import info.nightscout.interfaces.ui.UiInteraction import info.nightscout.interfaces.ui.UiInteraction
import info.nightscout.rx.bus.RxBus
import info.nightscout.shared.interfaces.ResourceHelper import info.nightscout.shared.interfaces.ResourceHelper
import info.nightscout.shared.sharedPreferences.SP import info.nightscout.shared.sharedPreferences.SP
import info.nightscout.sharedtests.TestBase import info.nightscout.sharedtests.TestBase
@ -37,6 +36,6 @@ class ConfigBuilderPluginTest : TestBase() {
@BeforeEach @BeforeEach
fun prepareMock() { fun prepareMock() {
configBuilderPlugin = ConfigBuilderPlugin(injector, aapsLogger, rh, sp, RxBus(aapsSchedulers, aapsLogger), activePlugin, uel, pumpSync, protectionCheck, uiInteraction) configBuilderPlugin = ConfigBuilderPlugin(injector, aapsLogger, rh, sp, rxBus, activePlugin, uel, pumpSync, protectionCheck, uiInteraction)
} }
} }

View file

@ -14,8 +14,8 @@ import info.nightscout.implementation.iob.GlucoseStatusProviderImpl
import info.nightscout.interfaces.ApsMode import info.nightscout.interfaces.ApsMode
import info.nightscout.interfaces.bgQualityCheck.BgQualityCheck import info.nightscout.interfaces.bgQualityCheck.BgQualityCheck
import info.nightscout.interfaces.constraints.Constraint import info.nightscout.interfaces.constraints.Constraint
import info.nightscout.interfaces.constraints.Constraints
import info.nightscout.interfaces.constraints.Objectives import info.nightscout.interfaces.constraints.Objectives
import info.nightscout.interfaces.constraints.PluginConstraints
import info.nightscout.interfaces.maintenance.PrefFileListProvider import info.nightscout.interfaces.maintenance.PrefFileListProvider
import info.nightscout.interfaces.plugin.PluginBase import info.nightscout.interfaces.plugin.PluginBase
import info.nightscout.interfaces.plugin.PluginType import info.nightscout.interfaces.plugin.PluginType
@ -74,7 +74,7 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
private lateinit var danaPump: DanaPump private lateinit var danaPump: DanaPump
private lateinit var insightDbHelper: InsightDbHelper private lateinit var insightDbHelper: InsightDbHelper
private lateinit var constraintChecker: ConstraintsImpl private lateinit var constraintChecker: ConstraintsCheckerImpl
private lateinit var safetyPlugin: SafetyPlugin private lateinit var safetyPlugin: SafetyPlugin
private lateinit var objectivesPlugin: ObjectivesPlugin private lateinit var objectivesPlugin: ObjectivesPlugin
private lateinit var comboPlugin: ComboPlugin private lateinit var comboPlugin: ComboPlugin
@ -134,7 +134,7 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
`when`(sp.getString(R.string.key_danar_bt_name, "")).thenReturn("") `when`(sp.getString(R.string.key_danar_bt_name, "")).thenReturn("")
//SafetyPlugin //SafetyPlugin
constraintChecker = ConstraintsImpl(activePlugin) constraintChecker = ConstraintsCheckerImpl(activePlugin, aapsLogger)
val glucoseStatusProvider = GlucoseStatusProviderImpl(aapsLogger, iobCobCalculator, dateUtil, decimalFormatter) val glucoseStatusProvider = GlucoseStatusProviderImpl(aapsLogger, iobCobCalculator, dateUtil, decimalFormatter)
@ -226,7 +226,7 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
constraintsPluginsList.add(insightPlugin) constraintsPluginsList.add(insightPlugin)
constraintsPluginsList.add(openAPSAMAPlugin) constraintsPluginsList.add(openAPSAMAPlugin)
constraintsPluginsList.add(openAPSSMBPlugin) constraintsPluginsList.add(openAPSSMBPlugin)
`when`(activePlugin.getSpecificPluginsListByInterface(Constraints::class.java)).thenReturn(constraintsPluginsList) `when`(activePlugin.getSpecificPluginsListByInterface(PluginConstraints::class.java)).thenReturn(constraintsPluginsList)
objectivesPlugin.onStart() objectivesPlugin.onStart()
} }
@ -268,7 +268,7 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
val c = constraintChecker.isAutosensModeEnabled() val c = constraintChecker.isAutosensModeEnabled()
assertThat(c.reasonList).hasSize(2) // Safety & Objectives assertThat(c.reasonList).hasSize(2) // Safety & Objectives
assertThat(c.mostLimitedReasonList).hasSize(2) // Safety & Objectives assertThat(c.mostLimitedReasonList).hasSize(2) // Safety & Objectives
assertThat( c.value()).isFalse() assertThat(c.value()).isFalse()
} }
// Safety // Safety
@ -278,7 +278,7 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
val c = constraintChecker.isAdvancedFilteringEnabled() val c = constraintChecker.isAdvancedFilteringEnabled()
assertThat(c.reasonList).hasSize(1) // Safety assertThat(c.reasonList).hasSize(1) // Safety
assertThat(c.mostLimitedReasonList).hasSize(1) // Safety assertThat(c.mostLimitedReasonList).hasSize(1) // Safety
assertThat( c.value()).isFalse() assertThat(c.value()).isFalse()
} }
// SMB should limit // SMB should limit
@ -286,7 +286,7 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
fun isSuperBolusEnabledTest() { fun isSuperBolusEnabledTest() {
openAPSSMBPlugin.setPluginEnabled(PluginType.APS, true) openAPSSMBPlugin.setPluginEnabled(PluginType.APS, true)
val c = constraintChecker.isSuperBolusEnabled() val c = constraintChecker.isSuperBolusEnabled()
assertThat( c.value()).isFalse() // SMB should limit assertThat(c.value()).isFalse() // SMB should limit
} }
// Safety & Objectives // Safety & Objectives
@ -296,11 +296,11 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
objectivesPlugin.objectives[Objectives.SMB_OBJECTIVE].startedOn = 0 objectivesPlugin.objectives[Objectives.SMB_OBJECTIVE].startedOn = 0
`when`(sp.getBoolean(info.nightscout.plugins.aps.R.string.key_use_smb, false)).thenReturn(false) `when`(sp.getBoolean(info.nightscout.plugins.aps.R.string.key_use_smb, false)).thenReturn(false)
`when`(sp.getString(info.nightscout.core.utils.R.string.key_aps_mode, ApsMode.OPEN.name)).thenReturn(ApsMode.OPEN.name) `when`(sp.getString(info.nightscout.core.utils.R.string.key_aps_mode, ApsMode.OPEN.name)).thenReturn(ApsMode.OPEN.name)
// `when`(constraintChecker.isClosedLoopAllowed()).thenReturn(Constraint(true)) // `when`(constraintChecker.isClosedLoopAllowed()).thenReturn(ConstraintObject(true))
val c = constraintChecker.isSMBModeEnabled() val c = constraintChecker.isSMBModeEnabled()
assertThat(c.reasonList).hasSize(3) // 2x Safety & Objectives assertThat(c.reasonList).hasSize(3) // 2x Safety & Objectives
assertThat(c.mostLimitedReasonList).hasSize(3) // 2x Safety & Objectives assertThat(c.mostLimitedReasonList).hasSize(3) // 2x Safety & Objectives
assertThat( c.value()).isFalse() assertThat(c.value()).isFalse()
} }
// applyBasalConstraints tests // applyBasalConstraints tests
@ -326,9 +326,9 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
// Apply all limits // Apply all limits
val d = constraintChecker.getMaxBasalAllowed(validProfile) val d = constraintChecker.getMaxBasalAllowed(validProfile)
assertThat( d.value()).isWithin( 0.01).of(0.8) assertThat(d.value()).isWithin(0.01).of(0.8)
assertThat(d.reasonList).hasSize(3) assertThat(d.reasonList).hasSize(3)
assertThat(d.getMostLimitedReasons(aapsLogger)).isEqualTo("DanaR: Limiting max basal rate to 0.80 U/h because of pump limit") assertThat(d.getMostLimitedReasons()).isEqualTo("DanaR: Limiting max basal rate to 0.80 U/h because of pump limit")
} }
@Test @Test
@ -355,7 +355,7 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
val i = constraintChecker.getMaxBasalPercentAllowed(validProfile) val i = constraintChecker.getMaxBasalPercentAllowed(validProfile)
assertThat(i.value()).isEqualTo(200) assertThat(i.value()).isEqualTo(200)
assertThat(i.reasonList).hasSize(6) assertThat(i.reasonList).hasSize(6)
assertThat(i.getMostLimitedReasons(aapsLogger)).isEqualTo("Safety: Limiting max percent rate to 200% because of pump limit") assertThat(i.getMostLimitedReasons()).isEqualTo("Safety: Limiting max percent rate to 200% because of pump limit")
} }
// applyBolusConstraints tests // applyBolusConstraints tests
@ -380,9 +380,9 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
// Apply all limits // Apply all limits
val d = constraintChecker.getMaxBolusAllowed() val d = constraintChecker.getMaxBolusAllowed()
assertThat( d.value()).isWithin( 0.01).of(3.0) assertThat(d.value()).isWithin(0.01).of(3.0)
assertThat(d.reasonList).hasSize(4) // 2x Safety & RS & R assertThat(d.reasonList).hasSize(4) // 2x Safety & RS & R
assertThat(d.getMostLimitedReasons(aapsLogger)).isEqualTo("Safety: Limiting bolus to 3.0 U because of max value in preferences") assertThat(d.getMostLimitedReasons()).isEqualTo("Safety: Limiting bolus to 3.0 U because of max value in preferences")
} }
// applyCarbsConstraints tests // applyCarbsConstraints tests
@ -395,7 +395,7 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
val i = constraintChecker.getMaxCarbsAllowed() val i = constraintChecker.getMaxCarbsAllowed()
assertThat(i.value()).isEqualTo(48) assertThat(i.value()).isEqualTo(48)
assertThat(i.reasonList).hasSize(1) assertThat(i.reasonList).hasSize(1)
assertThat(i.getMostLimitedReasons(aapsLogger)).isEqualTo("Safety: Limiting carbs to 48 g because of max value in preferences") assertThat(i.getMostLimitedReasons()).isEqualTo("Safety: Limiting carbs to 48 g because of max value in preferences")
} }
// applyMaxIOBConstraints tests // applyMaxIOBConstraints tests
@ -410,9 +410,9 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
// Apply all limits // Apply all limits
val d = constraintChecker.getMaxIOBAllowed() val d = constraintChecker.getMaxIOBAllowed()
assertThat( d.value()).isWithin( 0.01).of(1.5) assertThat(d.value()).isWithin(0.01).of(1.5)
assertThat(d.reasonList).hasSize(2) assertThat(d.reasonList).hasSize(2)
assertThat(d.getMostLimitedReasons(aapsLogger)).isEqualTo("OpenAPSAMA: Limiting IOB to 1.5 U because of max value in preferences") assertThat(d.getMostLimitedReasons()).isEqualTo("OpenAPSAMA: Limiting IOB to 1.5 U because of max value in preferences")
} }
@Test @Test
@ -426,8 +426,8 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
// Apply all limits // Apply all limits
val d = constraintChecker.getMaxIOBAllowed() val d = constraintChecker.getMaxIOBAllowed()
assertThat( d.value()).isWithin( 0.01).of(3.0) assertThat(d.value()).isWithin(0.01).of(3.0)
assertThat(d.reasonList).hasSize(2) assertThat(d.reasonList).hasSize(2)
assertThat(d.getMostLimitedReasons(aapsLogger)).isEqualTo("OpenAPSSMB: Limiting IOB to 3.0 U because of max value in preferences") assertThat(d.getMostLimitedReasons()).isEqualTo("OpenAPSSMB: Limiting IOB to 3.0 U because of max value in preferences")
} }
} }

View file

@ -1,6 +1,7 @@
package info.nightscout.plugins.general.maintenance package info.nightscout.plugins.general.maintenance
import android.content.Context import android.content.Context
import com.google.common.truth.Truth.assertThat
import dagger.android.HasAndroidInjector import dagger.android.HasAndroidInjector
import info.nightscout.configuration.maintenance.MaintenancePlugin import info.nightscout.configuration.maintenance.MaintenancePlugin
import info.nightscout.interfaces.Config import info.nightscout.interfaces.Config
@ -10,7 +11,6 @@ import info.nightscout.interfaces.nsclient.NSSettingsStatus
import info.nightscout.shared.interfaces.ResourceHelper import info.nightscout.shared.interfaces.ResourceHelper
import info.nightscout.shared.sharedPreferences.SP import info.nightscout.shared.sharedPreferences.SP
import info.nightscout.sharedtests.TestBase import info.nightscout.sharedtests.TestBase
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test
import org.mockito.Mock import org.mockito.Mock
@ -40,11 +40,12 @@ class MaintenancePluginTest : TestBase() {
@Test fun logFilesTest() { @Test fun logFilesTest() {
var logs = sut.getLogFiles(2) var logs = sut.getLogFiles(2)
Assertions.assertEquals(2, logs.size) assertThat(logs.map { it.name }).containsExactly(
Assertions.assertEquals("AndroidAPS.log", logs[0].name) "AndroidAPS.log",
Assertions.assertEquals("AndroidAPS.2018-01-03_01-01-00.1.zip", logs[1].name) "AndroidAPS.2018-01-03_01-01-00.1.zip",
).inOrder()
logs = sut.getLogFiles(10) logs = sut.getLogFiles(10)
Assertions.assertEquals(4, logs.size) assertThat(logs).hasSize(4)
} }
@Test @Test
@ -53,7 +54,7 @@ class MaintenancePluginTest : TestBase() {
val name = "AndroidAPS.log.zip" val name = "AndroidAPS.log.zip"
var zipFile = File("build/$name") var zipFile = File("build/$name")
zipFile = sut.zipLogs(zipFile, logs) zipFile = sut.zipLogs(zipFile, logs)
Assertions.assertTrue(zipFile.exists()) assertThat(zipFile.exists()).isTrue()
Assertions.assertTrue(zipFile.isFile) assertThat(zipFile.isFile).isTrue()
} }
} }

View file

@ -3,12 +3,12 @@ package info.nightscout.plugins.safety
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import dagger.android.AndroidInjector import dagger.android.AndroidInjector
import dagger.android.HasAndroidInjector import dagger.android.HasAndroidInjector
import info.nightscout.core.constraints.ConstraintObject
import info.nightscout.database.impl.AppRepository import info.nightscout.database.impl.AppRepository
import info.nightscout.interfaces.ApsMode import info.nightscout.interfaces.ApsMode
import info.nightscout.interfaces.Constants
import info.nightscout.interfaces.bgQualityCheck.BgQualityCheck import info.nightscout.interfaces.bgQualityCheck.BgQualityCheck
import info.nightscout.interfaces.constraints.Constraint import info.nightscout.interfaces.constraints.Constraint
import info.nightscout.interfaces.constraints.Constraints import info.nightscout.interfaces.constraints.ConstraintsChecker
import info.nightscout.interfaces.iob.GlucoseStatusProvider import info.nightscout.interfaces.iob.GlucoseStatusProvider
import info.nightscout.interfaces.plugin.PluginType import info.nightscout.interfaces.plugin.PluginType
import info.nightscout.interfaces.profiling.Profiler import info.nightscout.interfaces.profiling.Profiler
@ -29,7 +29,7 @@ import org.mockito.Mockito.`when`
class SafetyPluginTest : TestBaseWithProfile() { class SafetyPluginTest : TestBaseWithProfile() {
@Mock lateinit var constraintChecker: Constraints @Mock lateinit var constraintChecker: ConstraintsChecker
@Mock lateinit var virtualPumpPlugin: VirtualPumpPlugin @Mock lateinit var virtualPumpPlugin: VirtualPumpPlugin
@Mock lateinit var glimpPlugin: GlimpPlugin @Mock lateinit var glimpPlugin: GlimpPlugin
@Mock lateinit var profiler: Profiler @Mock lateinit var profiler: Profiler
@ -43,7 +43,10 @@ class SafetyPluginTest : TestBaseWithProfile() {
private lateinit var openAPSAMAPlugin: OpenAPSAMAPlugin private lateinit var openAPSAMAPlugin: OpenAPSAMAPlugin
private lateinit var openAPSSMBPlugin: OpenAPSSMBPlugin private lateinit var openAPSSMBPlugin: OpenAPSSMBPlugin
private val injector = HasAndroidInjector { AndroidInjector { } } private val injector = HasAndroidInjector {
AndroidInjector {
}
}
private val pumpDescription = PumpDescription() private val pumpDescription = PumpDescription()
@BeforeEach @BeforeEach
@ -86,9 +89,8 @@ class SafetyPluginTest : TestBaseWithProfile() {
@Test @Test
fun pumpDescriptionShouldLimitLoopInvocation() { fun pumpDescriptionShouldLimitLoopInvocation() {
pumpDescription.isTempBasalCapable = false pumpDescription.isTempBasalCapable = false
var c = Constraint(true) val c = safetyPlugin.isLoopInvocationAllowed(ConstraintObject(true, aapsLogger))
c = safetyPlugin.isLoopInvocationAllowed(c) assertThat(c.getReasons()).isEqualTo("Safety: Pump is not temp basal capable")
assertThat(c.getReasons(aapsLogger)).isEqualTo("Safety: Pump is not temp basal capable")
assertThat(c.value()).isFalse() assertThat(c.value()).isFalse()
} }
@ -96,47 +98,42 @@ class SafetyPluginTest : TestBaseWithProfile() {
fun disabledEngineeringModeShouldLimitClosedLoop() { fun disabledEngineeringModeShouldLimitClosedLoop() {
`when`(sp.getString(info.nightscout.core.utils.R.string.key_aps_mode, ApsMode.OPEN.name)).thenReturn(ApsMode.CLOSED.name) `when`(sp.getString(info.nightscout.core.utils.R.string.key_aps_mode, ApsMode.OPEN.name)).thenReturn(ApsMode.CLOSED.name)
`when`(config.isEngineeringModeOrRelease()).thenReturn(false) `when`(config.isEngineeringModeOrRelease()).thenReturn(false)
var c = Constraint(true) val c = safetyPlugin.isClosedLoopAllowed(ConstraintObject(true, aapsLogger))
c = safetyPlugin.isClosedLoopAllowed(c) assertThat(c.getReasons()).contains("Running dev version. Closed loop is disabled.")
assertThat(c.getReasons(aapsLogger)).contains("Running dev version. Closed loop is disabled.")
assertThat(c.value()).isFalse() assertThat(c.value()).isFalse()
} }
@Test @Test
fun setOpenLoopInPreferencesShouldLimitClosedLoop() { fun setOpenLoopInPreferencesShouldLimitClosedLoop() {
`when`(sp.getString(info.nightscout.core.utils.R.string.key_aps_mode, ApsMode.OPEN.name)).thenReturn(ApsMode.OPEN.name) `when`(sp.getString(info.nightscout.core.utils.R.string.key_aps_mode, ApsMode.OPEN.name)).thenReturn(ApsMode.OPEN.name)
var c = Constraint(true) val c = safetyPlugin.isClosedLoopAllowed(ConstraintObject(true, aapsLogger))
c = safetyPlugin.isClosedLoopAllowed(c) assertThat(c.getReasons()).contains("Closed loop mode disabled in preferences")
assertThat(c.getReasons(aapsLogger)).contains("Closed loop mode disabled in preferences")
assertThat(c.value()).isFalse() assertThat(c.value()).isFalse()
} }
@Test @Test
fun notEnabledSMBInPreferencesDisablesSMB() { fun notEnabledSMBInPreferencesDisablesSMB() {
`when`(sp.getBoolean(info.nightscout.plugins.aps.R.string.key_use_smb, false)).thenReturn(false) `when`(sp.getBoolean(info.nightscout.plugins.aps.R.string.key_use_smb, false)).thenReturn(false)
`when`(constraintChecker.isClosedLoopAllowed(anyObject())).thenReturn(Constraint(true)) `when`(constraintChecker.isClosedLoopAllowed(anyObject())).thenReturn(ConstraintObject(true, aapsLogger))
var c = Constraint(true) val c = openAPSSMBPlugin.isSMBModeEnabled(ConstraintObject(true, aapsLogger))
c = openAPSSMBPlugin.isSMBModeEnabled(c) assertThat(c.getReasons()).contains("SMB disabled in preferences")
assertThat(c.getReasons(aapsLogger)).contains("SMB disabled in preferences")
assertThat(c.value()).isFalse() assertThat(c.value()).isFalse()
} }
@Test @Test
fun openLoopPreventsSMB() { fun openLoopPreventsSMB() {
`when`(sp.getBoolean(info.nightscout.plugins.aps.R.string.key_use_smb, false)).thenReturn(true) `when`(sp.getBoolean(info.nightscout.plugins.aps.R.string.key_use_smb, false)).thenReturn(true)
`when`(constraintChecker.isClosedLoopAllowed(anyObject())).thenReturn(Constraint(false)) `when`(constraintChecker.isClosedLoopAllowed()).thenReturn(ConstraintObject(false, aapsLogger))
var c = Constraint(true) val c = safetyPlugin.isSMBModeEnabled(ConstraintObject(true, aapsLogger))
c = safetyPlugin.isSMBModeEnabled(c) assertThat(c.getReasons()).contains("SMB not allowed in open loop mode")
assertThat(c.getReasons(aapsLogger)).contains("SMB not allowed in open loop mode")
assertThat(c.value()).isFalse() assertThat(c.value()).isFalse()
} }
@Test @Test
fun bgSourceShouldPreventSMBAlways() { fun bgSourceShouldPreventSMBAlways() {
`when`(activePlugin.activeBgSource).thenReturn(glimpPlugin) `when`(activePlugin.activeBgSource).thenReturn(glimpPlugin)
var c = Constraint(true) val c = safetyPlugin.isAdvancedFilteringEnabled(ConstraintObject(true, aapsLogger))
c = safetyPlugin.isAdvancedFilteringEnabled(c) assertThat(c.getReasons()).isEqualTo("Safety: SMB always and after carbs disabled because active BG source doesn\\'t support advanced filtering")
assertThat(c.getReasons(aapsLogger)).isEqualTo("Safety: SMB always and after carbs disabled because active BG source doesn\\'t support advanced filtering")
assertThat(c.value()).isFalse() assertThat(c.value()).isFalse()
} }
@ -146,24 +143,26 @@ class SafetyPluginTest : TestBaseWithProfile() {
`when`(sp.getDouble(info.nightscout.plugins.aps.R.string.key_openapsama_current_basal_safety_multiplier, 4.0)).thenReturn(4.0) `when`(sp.getDouble(info.nightscout.plugins.aps.R.string.key_openapsama_current_basal_safety_multiplier, 4.0)).thenReturn(4.0)
`when`(sp.getDouble(info.nightscout.plugins.aps.R.string.key_openapsama_max_daily_safety_multiplier, 3.0)).thenReturn(3.0) `when`(sp.getDouble(info.nightscout.plugins.aps.R.string.key_openapsama_max_daily_safety_multiplier, 3.0)).thenReturn(3.0)
`when`(sp.getString(info.nightscout.core.utils.R.string.key_age, "")).thenReturn("child") `when`(sp.getString(info.nightscout.core.utils.R.string.key_age, "")).thenReturn("child")
val c = Constraint(Constants.REALLYHIGHBASALRATE) val c = ConstraintObject(Double.MAX_VALUE, aapsLogger)
safetyPlugin.applyBasalConstraints(c, validProfile) safetyPlugin.applyBasalConstraints(c, validProfile)
assertThat(c.value()).isWithin(0.01).of(2.0) assertThat(c.value()).isWithin(0.01).of(2.0)
assertThat(c.getReasons(aapsLogger)).isEqualTo( assertThat(c.getReasons()).isEqualTo(
""" """
Safety: Limiting max basal rate to 2.00 U/h because of hard limit Safety: Limiting max basal rate to 2.00 U/h because of hard limit
""".trimIndent()) """.trimIndent()
assertThat(c.getMostLimitedReasons(aapsLogger)).isEqualTo("Safety: Limiting max basal rate to 2.00 U/h because of hard limit") )
assertThat(c.getMostLimitedReasons()).isEqualTo("Safety: Limiting max basal rate to 2.00 U/h because of hard limit")
} }
@Test @Test
fun doNotAllowNegativeBasalRate() { fun doNotAllowNegativeBasalRate() {
`when`(sp.getString(info.nightscout.core.utils.R.string.key_age, "")).thenReturn("child") `when`(sp.getString(info.nightscout.core.utils.R.string.key_age, "")).thenReturn("child")
val d = Constraint(-0.5) val d = ConstraintObject(-0.5, aapsLogger)
safetyPlugin.applyBasalConstraints(d, validProfile) safetyPlugin.applyBasalConstraints(d, validProfile)
assertThat(d.value()).isWithin(0.01).of(0.0) assertThat(d.value()).isWithin(0.01).of(0.0)
assertThat(d.getReasons(aapsLogger)).isEqualTo( assertThat(d.getReasons()).isEqualTo(
"Safety: Limiting max basal rate to 0.00 U/h because of it must be positive value") "Safety: Limiting max basal rate to 0.00 U/h because of it must be positive value"
)
} }
@Test @Test
@ -173,19 +172,20 @@ class SafetyPluginTest : TestBaseWithProfile() {
`when`(sp.getDouble(info.nightscout.plugins.aps.R.string.key_openapsama_current_basal_safety_multiplier, 4.0)).thenReturn(4.0) `when`(sp.getDouble(info.nightscout.plugins.aps.R.string.key_openapsama_current_basal_safety_multiplier, 4.0)).thenReturn(4.0)
`when`(sp.getDouble(info.nightscout.plugins.aps.R.string.key_openapsama_max_daily_safety_multiplier, 3.0)).thenReturn(3.0) `when`(sp.getDouble(info.nightscout.plugins.aps.R.string.key_openapsama_max_daily_safety_multiplier, 3.0)).thenReturn(3.0)
`when`(sp.getString(info.nightscout.core.utils.R.string.key_age, "")).thenReturn("child") `when`(sp.getString(info.nightscout.core.utils.R.string.key_age, "")).thenReturn("child")
val i = Constraint(Constants.REALLYHIGHPERCENTBASALRATE) val i = ConstraintObject(Int.MAX_VALUE, aapsLogger)
safetyPlugin.applyBasalPercentConstraints(i, validProfile) safetyPlugin.applyBasalPercentConstraints(i, validProfile)
assertThat(i.value()).isEqualTo(200) assertThat(i.value()).isEqualTo(200)
assertThat(i.getReasons(aapsLogger)).isEqualTo( assertThat(i.getReasons()).isEqualTo(
""" """
Safety: Percent rate 1111111% recalculated to 11111.11 U/h with current basal 1.00 U/h Safety: Percent rate 2147483647% recalculated to 21474836.47 U/h with current basal 1.00 U/h
Safety: Limiting max basal rate to 2.00 U/h because of hard limit Safety: Limiting max basal rate to 2.00 U/h because of hard limit
Safety: Limiting max percent rate to 200% because of pump limit Safety: Limiting max percent rate to 200% because of pump limit
Safety: Limiting max basal rate to 500.00 U/h because of pump limit Safety: Limiting max basal rate to 500.00 U/h because of pump limit
""".trimIndent() """.trimIndent()
) )
assertThat(i.getMostLimitedReasons(aapsLogger)).isEqualTo( assertThat(i.getMostLimitedReasons()).isEqualTo(
"Safety: Limiting max percent rate to 200% because of pump limit") "Safety: Limiting max percent rate to 200% because of pump limit"
)
} }
@Test @Test
@ -196,57 +196,58 @@ Safety: Limiting max basal rate to 500.00 U/h because of pump limit
`when`(sp.getDouble(info.nightscout.plugins.aps.R.string.key_openapsama_max_daily_safety_multiplier, 3.0)).thenReturn(3.0) `when`(sp.getDouble(info.nightscout.plugins.aps.R.string.key_openapsama_max_daily_safety_multiplier, 3.0)).thenReturn(3.0)
`when`(sp.getString(info.nightscout.core.utils.R.string.key_age, "")).thenReturn("child") `when`(sp.getString(info.nightscout.core.utils.R.string.key_age, "")).thenReturn("child")
openAPSSMBPlugin.setPluginEnabled(PluginType.APS, true) openAPSSMBPlugin.setPluginEnabled(PluginType.APS, true)
val i = Constraint(Constants.REALLYHIGHBASALRATE) val i = ConstraintObject(Double.MAX_VALUE, aapsLogger)
openAPSSMBPlugin.applyBasalConstraints(i, validProfile) openAPSSMBPlugin.applyBasalConstraints(i, validProfile)
assertThat(i.value()).isWithin(0.01).of(1.0) assertThat(i.value()).isWithin(0.01).of(1.0)
assertThat(i.getReasons(aapsLogger)).isEqualTo( assertThat(i.getReasons()).isEqualTo(
""" """
OpenAPSSMB: Limiting max basal rate to 1.00 U/h because of max value in preferences OpenAPSSMB: Limiting max basal rate to 1.00 U/h because of max value in preferences
OpenAPSSMB: Limiting max basal rate to 4.00 U/h because of max basal multiplier OpenAPSSMB: Limiting max basal rate to 4.00 U/h because of max basal multiplier
OpenAPSSMB: Limiting max basal rate to 3.00 U/h because of max daily basal multiplier OpenAPSSMB: Limiting max basal rate to 3.00 U/h because of max daily basal multiplier
""".trimIndent()) """.trimIndent()
assertThat(i.getMostLimitedReasons(aapsLogger)).isEqualTo("OpenAPSSMB: Limiting max basal rate to 1.00 U/h because of max value in preferences") )
assertThat(i.getMostLimitedReasons()).isEqualTo("OpenAPSSMB: Limiting max basal rate to 1.00 U/h because of max value in preferences")
} }
@Test @Test
fun doNotAllowNegativePercentBasalRate() { fun doNotAllowNegativePercentBasalRate() {
`when`(sp.getString(info.nightscout.core.utils.R.string.key_age, "")).thenReturn("child") `when`(sp.getString(info.nightscout.core.utils.R.string.key_age, "")).thenReturn("child")
val i = Constraint(-22) val i = ConstraintObject(-22, aapsLogger)
safetyPlugin.applyBasalPercentConstraints(i, validProfile) safetyPlugin.applyBasalPercentConstraints(i, validProfile)
assertThat(i.value()).isEqualTo(0) assertThat(i.value()).isEqualTo(0)
assertThat(i.getReasons(aapsLogger)).isEqualTo( assertThat(i.getReasons()).isEqualTo(
""" """
Safety: Percent rate -22% recalculated to -0.22 U/h with current basal 1.00 U/h Safety: Percent rate -22% recalculated to -0.22 U/h with current basal 1.00 U/h
Safety: Limiting max basal rate to 0.00 U/h because of it must be positive value Safety: Limiting max basal rate to 0.00 U/h because of it must be positive value
Safety: Limiting max percent rate to 0% because of pump limit Safety: Limiting max percent rate to 0% because of pump limit
""".trimIndent()) """.trimIndent()
assertThat(i.getMostLimitedReasons(aapsLogger)).isEqualTo("Safety: Limiting max percent rate to 0% because of pump limit") )
assertThat(i.getMostLimitedReasons()).isEqualTo("Safety: Limiting max percent rate to 0% because of pump limit")
} }
@Test @Test
fun bolusAmountShouldBeLimited() { fun bolusAmountShouldBeLimited() {
`when`(sp.getDouble(info.nightscout.core.utils.R.string.key_treatmentssafety_maxbolus, 3.0)).thenReturn(3.0) `when`(sp.getDouble(info.nightscout.core.utils.R.string.key_treatmentssafety_maxbolus, 3.0)).thenReturn(3.0)
`when`(sp.getString(info.nightscout.core.utils.R.string.key_age, "")).thenReturn("child") `when`(sp.getString(info.nightscout.core.utils.R.string.key_age, "")).thenReturn("child")
var d = Constraint(Constants.REALLYHIGHBOLUS) val d = safetyPlugin.applyBolusConstraints(ConstraintObject(Double.MAX_VALUE, aapsLogger))
d = safetyPlugin.applyBolusConstraints(d)
assertThat(d.value()).isWithin(0.01).of(3.0) assertThat(d.value()).isWithin(0.01).of(3.0)
assertThat(d.getReasons(aapsLogger)).isEqualTo( assertThat(d.getReasons()).isEqualTo(
""" """
Safety: Limiting bolus to 3.0 U because of max value in preferences Safety: Limiting bolus to 3.0 U because of max value in preferences
Safety: Limiting bolus to 5.0 U because of hard limit Safety: Limiting bolus to 5.0 U because of hard limit
""".trimIndent()) """.trimIndent()
assertThat(d.getMostLimitedReasons(aapsLogger)).isEqualTo("Safety: Limiting bolus to 3.0 U because of max value in preferences") )
assertThat(d.getMostLimitedReasons()).isEqualTo("Safety: Limiting bolus to 3.0 U because of max value in preferences")
} }
@Test @Test
fun doNotAllowNegativeBolusAmount() { fun doNotAllowNegativeBolusAmount() {
`when`(sp.getDouble(info.nightscout.core.utils.R.string.key_treatmentssafety_maxbolus, 3.0)).thenReturn(3.0) `when`(sp.getDouble(info.nightscout.core.utils.R.string.key_treatmentssafety_maxbolus, 3.0)).thenReturn(3.0)
`when`(sp.getString(info.nightscout.core.utils.R.string.key_age, "")).thenReturn("child") `when`(sp.getString(info.nightscout.core.utils.R.string.key_age, "")).thenReturn("child")
var d = Constraint(-22.0) val d = safetyPlugin.applyBolusConstraints(ConstraintObject(-22.0, aapsLogger))
d = safetyPlugin.applyBolusConstraints(d)
assertThat(d.value()).isWithin(0.01).of(0.0) assertThat(d.value()).isWithin(0.01).of(0.0)
assertThat(d.getReasons(aapsLogger)).isEqualTo("Safety: Limiting bolus to 0.0 U because of it must be positive value") assertThat(d.getReasons()).isEqualTo("Safety: Limiting bolus to 0.0 U because of it must be positive value")
assertThat(d.getMostLimitedReasons(aapsLogger)).isEqualTo("Safety: Limiting bolus to 0.0 U because of it must be positive value") assertThat(d.getMostLimitedReasons()).isEqualTo("Safety: Limiting bolus to 0.0 U because of it must be positive value")
} }
@Test @Test
@ -255,15 +256,15 @@ Safety: Limiting max basal rate to 500.00 U/h because of pump limit
`when`(sp.getInt(info.nightscout.core.utils.R.string.key_treatmentssafety_maxcarbs, 48)).thenReturn(48) `when`(sp.getInt(info.nightscout.core.utils.R.string.key_treatmentssafety_maxcarbs, 48)).thenReturn(48)
// Negative carbs not allowed // Negative carbs not allowed
var i = Constraint(-22) var i: Constraint<Int> = ConstraintObject(-22, aapsLogger)
safetyPlugin.applyCarbsConstraints(i) safetyPlugin.applyCarbsConstraints(i)
assertThat(i.value()).isEqualTo(0) assertThat(i.value()).isEqualTo(0)
assertThat(i.getReasons(aapsLogger)).isEqualTo("Safety: Limiting carbs to 0 g because of it must be positive value") assertThat(i.getReasons()).isEqualTo("Safety: Limiting carbs to 0 g because of it must be positive value")
// Apply all limits // Apply all limits
i = safetyPlugin.applyCarbsConstraints(Constraint(Constants.REALLYHIGHCARBS)) i = safetyPlugin.applyCarbsConstraints(ConstraintObject(Int.MAX_VALUE, aapsLogger))
assertThat(i.value()).isEqualTo(48) assertThat(i.value()).isEqualTo(48)
assertThat(i.getReasons(aapsLogger)).isEqualTo("Safety: Limiting carbs to 48 g because of max value in preferences") assertThat(i.getReasons()).isEqualTo("Safety: Limiting carbs to 48 g because of max value in preferences")
} }
@Test @Test
@ -278,24 +279,24 @@ Safety: Limiting max basal rate to 500.00 U/h because of pump limit
`when`(sp.getString(info.nightscout.core.utils.R.string.key_age, "")).thenReturn("teenage") `when`(sp.getString(info.nightscout.core.utils.R.string.key_age, "")).thenReturn("teenage")
// Apply all limits // Apply all limits
var d = Constraint(Constants.REALLYHIGHIOB) var d: Constraint<Double> = ConstraintObject(Double.MAX_VALUE, aapsLogger)
d = safetyPlugin.applyMaxIOBConstraints(d) d = safetyPlugin.applyMaxIOBConstraints(d)
assertThat(d.value()).isWithin(0.01).of(HardLimits.MAX_IOB_LGS) assertThat(d.value()).isWithin(0.01).of(HardLimits.MAX_IOB_LGS)
assertThat(d.getReasons(aapsLogger)).isEqualTo("Safety: Limiting IOB to 0.0 U because of Low Glucose Suspend") assertThat(d.getReasons()).isEqualTo("Safety: Limiting IOB to 0.0 U because of Low Glucose Suspend")
assertThat(d.getMostLimitedReasons(aapsLogger)).isEqualTo("Safety: Limiting IOB to 0.0 U because of Low Glucose Suspend") assertThat(d.getMostLimitedReasons()).isEqualTo("Safety: Limiting IOB to 0.0 U because of Low Glucose Suspend")
// Apply all limits // Apply all limits
d = Constraint(Constants.REALLYHIGHIOB) d = ConstraintObject(Double.MAX_VALUE, aapsLogger)
val a = openAPSAMAPlugin.applyMaxIOBConstraints(d) val a = openAPSAMAPlugin.applyMaxIOBConstraints(d)
assertThat(a.value()).isWithin(0.01).of(1.5) assertThat(a.value()).isWithin(0.01).of(1.5)
assertThat(d.getReasons(aapsLogger)).isEqualTo("OpenAPSAMA: Limiting IOB to 1.5 U because of max value in preferences\nOpenAPSAMA: Limiting IOB to 7.0 U because of hard limit") assertThat(d.getReasons()).isEqualTo("OpenAPSAMA: Limiting IOB to 1.5 U because of max value in preferences\nOpenAPSAMA: Limiting IOB to 7.0 U because of hard limit")
assertThat(d.getMostLimitedReasons(aapsLogger)).isEqualTo("OpenAPSAMA: Limiting IOB to 1.5 U because of max value in preferences") assertThat(d.getMostLimitedReasons()).isEqualTo("OpenAPSAMA: Limiting IOB to 1.5 U because of max value in preferences")
// Apply all limits // Apply all limits
d = Constraint(Constants.REALLYHIGHIOB) d = ConstraintObject(Double.MAX_VALUE, aapsLogger)
val s = openAPSSMBPlugin.applyMaxIOBConstraints(d) val s = openAPSSMBPlugin.applyMaxIOBConstraints(d)
assertThat(s.value()).isWithin(0.01).of(3.0) assertThat(s.value()).isWithin(0.01).of(3.0)
assertThat(d.getReasons(aapsLogger)).isEqualTo("OpenAPSSMB: Limiting IOB to 3.0 U because of max value in preferences\nOpenAPSSMB: Limiting IOB to 22.0 U because of hard limit") assertThat(d.getReasons()).isEqualTo("OpenAPSSMB: Limiting IOB to 3.0 U because of max value in preferences\nOpenAPSSMB: Limiting IOB to 22.0 U because of hard limit")
assertThat(d.getMostLimitedReasons(aapsLogger)).isEqualTo("OpenAPSSMB: Limiting IOB to 3.0 U because of max value in preferences") assertThat(d.getMostLimitedReasons()).isEqualTo("OpenAPSSMB: Limiting IOB to 3.0 U because of max value in preferences")
} }
} }

View file

@ -1,5 +1,6 @@
package info.nightscout.plugins.sensitivity package info.nightscout.plugins.sensitivity
import com.google.common.truth.Truth.assertThat
import dagger.android.AndroidInjector import dagger.android.AndroidInjector
import dagger.android.HasAndroidInjector import dagger.android.HasAndroidInjector
import info.nightscout.interfaces.aps.AutosensDataStore import info.nightscout.interfaces.aps.AutosensDataStore
@ -12,7 +13,6 @@ import info.nightscout.shared.interfaces.ResourceHelper
import info.nightscout.shared.sharedPreferences.SP import info.nightscout.shared.sharedPreferences.SP
import info.nightscout.sharedtests.TestBase import info.nightscout.sharedtests.TestBase
import org.json.JSONObject import org.json.JSONObject
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test
import org.mockito.Mock import org.mockito.Mock
@ -45,12 +45,12 @@ class AbstractSensitivityPluginTest : TestBase() {
fun fillResultTest() { fun fillResultTest() {
val sut = SensitivityTestClass(pluginDescription, aapsLogger, rh, sp) val sut = SensitivityTestClass(pluginDescription, aapsLogger, rh, sp)
var ar = sut.fillResult(1.0, 1.0, "1", "1.2", "1", 12, 0.7, 1.2) var ar = sut.fillResult(1.0, 1.0, "1", "1.2", "1", 12, 0.7, 1.2)
Assertions.assertEquals(1.0, ar.ratio, 0.01) assertThat(ar.ratio).isWithin(0.01).of(1.0)
ar = sut.fillResult(1.2, 1.0, "1", "1.2", "1", 40, 0.7, 1.2) ar = sut.fillResult(1.2, 1.0, "1", "1.2", "1", 40, 0.7, 1.2)
Assertions.assertEquals(1.16, ar.ratio, 0.01) assertThat(ar.ratio).isWithin(0.01).of(1.16)
ar = sut.fillResult(1.2, 1.0, "1", "1.2", "1", 50, 0.7, 1.2) ar = sut.fillResult(1.2, 1.0, "1", "1.2", "1", 50, 0.7, 1.2)
Assertions.assertEquals(1.2, ar.ratio, 0.01) assertThat(ar.ratio).isWithin(0.01).of(1.2)
ar = sut.fillResult(1.2, 1.0, "1", "1.2", "1", 50, 0.7, 1.1) ar = sut.fillResult(1.2, 1.0, "1", "1.2", "1", 50, 0.7, 1.1)
Assertions.assertEquals(1.1, ar.ratio, 0.01) assertThat(ar.ratio).isWithin(0.01).of(1.1)
} }
} }

View file

@ -1,5 +1,6 @@
package info.nightscout.pump package info.nightscout.pump
import com.google.common.truth.Truth.assertThat
import dagger.android.AndroidInjector import dagger.android.AndroidInjector
import dagger.android.HasAndroidInjector import dagger.android.HasAndroidInjector
import info.nightscout.core.pump.toHtml import info.nightscout.core.pump.toHtml
@ -8,7 +9,6 @@ import info.nightscout.plugins.aps.loop.extensions.json
import info.nightscout.pump.virtual.extensions.toText import info.nightscout.pump.virtual.extensions.toText
import info.nightscout.sharedtests.TestBaseWithProfile import info.nightscout.sharedtests.TestBaseWithProfile
import org.json.JSONObject import org.json.JSONObject
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test
import org.mockito.Mockito.`when` import org.mockito.Mockito.`when`
@ -42,132 +42,132 @@ class PumpEnactResultTest : TestBaseWithProfile() {
val per = PumpEnactResult(injector) val per = PumpEnactResult(injector)
per.success(true) per.success(true)
Assertions.assertEquals(true, per.success) assertThat(per.success).isTrue()
} }
@Test fun enactedTest() { @Test fun enactedTest() {
val per = PumpEnactResult(injector) val per = PumpEnactResult(injector)
per.enacted(true) per.enacted(true)
Assertions.assertEquals(true, per.enacted) assertThat(per.enacted).isTrue()
} }
@Test fun commentTest() { @Test fun commentTest() {
val per = PumpEnactResult(injector) val per = PumpEnactResult(injector)
per.comment("SomeComment") per.comment("SomeComment")
Assertions.assertEquals("SomeComment", per.comment) assertThat(per.comment).isEqualTo("SomeComment")
} }
@Test fun durationTest() { @Test fun durationTest() {
val per = PumpEnactResult(injector) val per = PumpEnactResult(injector)
per.duration(10) per.duration(10)
Assertions.assertEquals(10, per.duration.toLong()) assertThat(per.duration.toLong()).isEqualTo(10L)
} }
@Test fun absoluteTest() { @Test fun absoluteTest() {
val per = PumpEnactResult(injector) val per = PumpEnactResult(injector)
per.absolute(11.0) per.absolute(11.0)
Assertions.assertEquals(11.0, per.absolute, 0.01) assertThat(per.absolute).isWithin(0.01).of(11.0)
} }
@Test fun percentTest() { @Test fun percentTest() {
val per = PumpEnactResult(injector) val per = PumpEnactResult(injector)
per.percent(10) per.percent(10)
Assertions.assertEquals(10, per.percent) assertThat(per.percent).isEqualTo(10)
} }
@Test fun isPercentTest() { @Test fun isPercentTest() {
val per = PumpEnactResult(injector) val per = PumpEnactResult(injector)
per.isPercent(true) per.isPercent(true)
Assertions.assertEquals(true, per.isPercent) assertThat(per.isPercent).isTrue()
} }
@Test fun isTempCancelTest() { @Test fun isTempCancelTest() {
val per = PumpEnactResult(injector) val per = PumpEnactResult(injector)
per.isTempCancel(true) per.isTempCancel(true)
Assertions.assertEquals(true, per.isTempCancel) assertThat(per.isTempCancel).isTrue()
} }
@Test fun bolusDeliveredTest() { @Test fun bolusDeliveredTest() {
val per = PumpEnactResult(injector) val per = PumpEnactResult(injector)
per.bolusDelivered(11.0) per.bolusDelivered(11.0)
Assertions.assertEquals(11.0, per.bolusDelivered, 0.01) assertThat(per.bolusDelivered).isWithin(0.01).of(11.0)
} }
@Test fun queuedTest() { @Test fun queuedTest() {
val per = PumpEnactResult(injector) val per = PumpEnactResult(injector)
per.queued(true) per.queued(true)
Assertions.assertEquals(true, per.queued) assertThat(per.queued).isTrue()
} }
@Test fun toStringTest() { @Test fun toStringTest() {
var per = PumpEnactResult(injector).enacted(true).bolusDelivered(10.0).comment("AAA") var per = PumpEnactResult(injector).enacted(true).bolusDelivered(10.0).comment("AAA")
Assertions.assertEquals( assertThat(per.toText(rh)).isEqualTo(
""" """
Success: false Success: false
Enacted: true Enacted: true
Comment: AAA Comment: AAA
Insulin: 10.0 U Insulin: 10.0 U
""".trimIndent(), per.toText(rh) """.trimIndent()
) )
per = PumpEnactResult(injector).enacted(true).isTempCancel(true).comment("AAA") per = PumpEnactResult(injector).enacted(true).isTempCancel(true).comment("AAA")
Assertions.assertEquals( assertThat(per.toText(rh)).isEqualTo(
""" """
Success: false Success: false
Enacted: true Enacted: true
Comment: AAA Comment: AAA
Cancel temp basal Cancel temp basal
""".trimIndent(), per.toText(rh) """.trimIndent()
) )
per = PumpEnactResult(injector).enacted(true).isPercent(true).percent(90).duration(20).comment("AAA") per = PumpEnactResult(injector).enacted(true).isPercent(true).percent(90).duration(20).comment("AAA")
Assertions.assertEquals( assertThat(per.toText(rh)).isEqualTo(
""" """
Success: false Success: false
Enacted: true Enacted: true
Comment: AAA Comment: AAA
Duration: 20 min Duration: 20 min
Percent: 90% Percent: 90%
""".trimIndent(), per.toText(rh) """.trimIndent()
) )
per = PumpEnactResult(injector).enacted(true).isPercent(false).absolute(1.0).duration(30).comment("AAA") per = PumpEnactResult(injector).enacted(true).isPercent(false).absolute(1.0).duration(30).comment("AAA")
Assertions.assertEquals( assertThat(per.toText(rh)).isEqualTo(
""" """
Success: false Success: false
Enacted: true Enacted: true
Comment: AAA Comment: AAA
Duration: 30 min Duration: 30 min
Absolute: 1.0 U/h Absolute: 1.0 U/h
""".trimIndent(), per.toText(rh) """.trimIndent()
) )
per = PumpEnactResult(injector).enacted(false).comment("AAA") per = PumpEnactResult(injector).enacted(false).comment("AAA")
Assertions.assertEquals( assertThat(per.toText(rh)).isEqualTo(
""" """
Success: false Success: false
Comment: AAA Comment: AAA
""".trimIndent(), per.toText(rh) """.trimIndent()
) )
} }
@Test fun toHtmlTest() { @Test fun toHtmlTest() {
var per: PumpEnactResult = PumpEnactResult(injector).enacted(true).bolusDelivered(10.0).comment("AAA") var per: PumpEnactResult = PumpEnactResult(injector).enacted(true).bolusDelivered(10.0).comment("AAA")
Assertions.assertEquals("<b>Success</b>: false<br><b>Enacted</b>: true<br><b>Comment</b>: AAA<br><b>SMB</b>: 10.0 U", per.toHtml(rh, decimalFormatter)) assertThat(per.toHtml(rh, decimalFormatter)).isEqualTo("<b>Success</b>: false<br><b>Enacted</b>: true<br><b>Comment</b>: AAA<br><b>SMB</b>: 10.0 U")
per = PumpEnactResult(injector).enacted(true).isTempCancel(true).comment("AAA") per = PumpEnactResult(injector).enacted(true).isTempCancel(true).comment("AAA")
Assertions.assertEquals("<b>Success</b>: false<br><b>Enacted</b>: true<br><b>Comment</b>: AAA<br>Cancel temp basal", per.toHtml(rh, decimalFormatter)) assertThat(per.toHtml(rh, decimalFormatter)).isEqualTo("<b>Success</b>: false<br><b>Enacted</b>: true<br><b>Comment</b>: AAA<br>Cancel temp basal")
per = PumpEnactResult(injector).enacted(true).isPercent(true).percent(90).duration(20).comment("AAA") per = PumpEnactResult(injector).enacted(true).isPercent(true).percent(90).duration(20).comment("AAA")
Assertions.assertEquals("<b>Success</b>: false<br><b>Enacted</b>: true<br><b>Comment</b>: AAA<br><b>Duration</b>: 20 min<br><b>Percent</b>: 90%", per.toHtml(rh, decimalFormatter)) assertThat(per.toHtml(rh, decimalFormatter)).isEqualTo("<b>Success</b>: false<br><b>Enacted</b>: true<br><b>Comment</b>: AAA<br><b>Duration</b>: 20 min<br><b>Percent</b>: 90%")
per = PumpEnactResult(injector).enacted(true).isPercent(false).absolute(1.0).duration(30).comment("AAA") per = PumpEnactResult(injector).enacted(true).isPercent(false).absolute(1.0).duration(30).comment("AAA")
Assertions.assertEquals("<b>Success</b>: false<br><b>Enacted</b>: true<br><b>Comment</b>: AAA<br><b>Duration</b>: 30 min<br><b>Absolute</b>: 1.00 U/h", per.toHtml(rh, decimalFormatter)) assertThat(per.toHtml(rh, decimalFormatter)).isEqualTo("<b>Success</b>: false<br><b>Enacted</b>: true<br><b>Comment</b>: AAA<br><b>Duration</b>: 30 min<br><b>Absolute</b>: 1.00 U/h")
per = PumpEnactResult(injector).enacted(false).comment("AAA") per = PumpEnactResult(injector).enacted(false).comment("AAA")
Assertions.assertEquals("<b>Success</b>: false<br><b>Comment</b>: AAA", per.toHtml(rh, decimalFormatter)) assertThat(per.toHtml(rh, decimalFormatter)).isEqualTo("<b>Success</b>: false<br><b>Comment</b>: AAA")
} }
@Test fun jsonTest() { @Test fun jsonTest() {
@ -175,15 +175,15 @@ class PumpEnactResultTest : TestBaseWithProfile() {
var per: PumpEnactResult = PumpEnactResult(injector).enacted(true).bolusDelivered(10.0).comment("AAA") var per: PumpEnactResult = PumpEnactResult(injector).enacted(true).bolusDelivered(10.0).comment("AAA")
o = per.json(validProfile.getBasal()) o = per.json(validProfile.getBasal())
JSONAssert.assertEquals("{\"smb\":10}", o, false) JSONAssert.assertEquals("""{"smb":10}""", o, false)
per = PumpEnactResult(injector).enacted(true).isTempCancel(true).comment("AAA") per = PumpEnactResult(injector).enacted(true).isTempCancel(true).comment("AAA")
o = per.json(validProfile.getBasal()) o = per.json(validProfile.getBasal())
JSONAssert.assertEquals("{\"rate\":0,\"duration\":0}", o, false) JSONAssert.assertEquals("""{"rate":0,"duration":0}""", o, false)
per = PumpEnactResult(injector).enacted(true).isPercent(true).percent(90).duration(20).comment("AAA") per = PumpEnactResult(injector).enacted(true).isPercent(true).percent(90).duration(20).comment("AAA")
o = per.json(validProfile.getBasal()) o = per.json(validProfile.getBasal())
JSONAssert.assertEquals("{\"rate\":0.9,\"duration\":20}", o, false) JSONAssert.assertEquals("""{"rate":0.9,"duration":20}""", o, false)
per = PumpEnactResult(injector).enacted(true).isPercent(false).absolute(1.0).duration(30).comment("AAA") per = PumpEnactResult(injector).enacted(true).isPercent(false).absolute(1.0).duration(30).comment("AAA")
o = per.json(validProfile.getBasal()) o = per.json(validProfile.getBasal())
JSONAssert.assertEquals("{\"rate\":1,\"duration\":30}", o, false) JSONAssert.assertEquals("""{"rate":1,"duration":30}""", o, false)
} }
} }

View file

@ -62,7 +62,7 @@ buildscript {
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:8.1.1' classpath 'com.android.tools.build:gradle:8.1.1'
classpath 'com.google.gms:google-services:4.3.15' classpath 'com.google.gms:google-services:4.4.0'
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.9' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.9'
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong
@ -79,7 +79,7 @@ buildscript {
plugins { plugins {
// Test Gradle build, keep disabled under normal circumstances // Test Gradle build, keep disabled under normal circumstances
// id "com.osacky.doctor" version "0.8.1" // id "com.osacky.doctor" version "0.8.1"
id "org.jlleitschuh.gradle.ktlint" version "11.5.1" id "org.jlleitschuh.gradle.ktlint" version "11.6.0"
// Aggregates and/or logs Jacoco test coverage to the Gradle build log // Aggregates and/or logs Jacoco test coverage to the Gradle build log
//id 'org.barfuin.gradle.jacocolog' version '3.1.0' //id 'org.barfuin.gradle.jacocolog' version '3.1.0'
id 'org.jetbrains.kotlin.android' version "$kotlin_version" apply false id 'org.jetbrains.kotlin.android' version "$kotlin_version" apply false

View file

@ -9,32 +9,44 @@ plugins {
apply from: "${project.rootDir}/core/main/android_dependencies.gradle" apply from: "${project.rootDir}/core/main/android_dependencies.gradle"
apply from: "${project.rootDir}/core/main/android_module_dependencies.gradle" apply from: "${project.rootDir}/core/main/android_module_dependencies.gradle"
apply from: "${project.rootDir}/core/main/allopen_dependencies.gradle"
apply from: "${project.rootDir}/core/main/test_dependencies.gradle"
apply from: "${project.rootDir}/core/main/jacoco_global.gradle"
android { android {
namespace 'info.nightscout.interfaces' namespace 'info.nightscout.interfaces'
defaultConfig {
minSdkVersion 25 // for wear
}
} }
dependencies { dependencies {
// I don't like this low level dependency but it helps
// to move more code to interface module
// database module is compiled longer anyway
// (ResourceHelper, AAPSLogger interface)
implementation project(':app-wear-shared:shared')
implementation project(':database:entities') implementation project(':database:entities')
implementation project(':core:ns-sdk')
api "androidx.appcompat:appcompat:$appcompat_version" api "androidx.appcompat:appcompat:$appcompat_version"
api "androidx.preference:preference-ktx:$preferencektx_version"
api "net.danlew:android.joda:$joda_version"
// Dagger
api "com.google.dagger:dagger:$dagger_version" api "com.google.dagger:dagger:$dagger_version"
api "com.google.dagger:dagger-android:$dagger_version" api "com.google.dagger:dagger-android:$dagger_version"
api "com.google.dagger:dagger-android-support:$dagger_version"
//Logger
api 'org.slf4j:slf4j-api:1.7.36' // 2.0.x breaks logging. Code change needed
api 'com.github.tony19:logback-android:2.0.0'
api "org.jetbrains.kotlinx:kotlinx-serialization-json:$kotlinx_serialization_version"
api "org.jetbrains.kotlinx:kotlinx-serialization-protobuf:$kotlinx_serialization_version"
api "com.caverock:androidsvg:$caverock_androidsvg_version"
api "org.apache.commons:commons-lang3:$commonslang3_version"
//RxBus
api "io.reactivex.rxjava3:rxjava:$rxjava_version"
api "io.reactivex.rxjava3:rxkotlin:$rxkotlin_version"
api "io.reactivex.rxjava3:rxandroid:$rxandroid_version"
// WorkerClasses // WorkerClasses
api "androidx.work:work-runtime-ktx:$work_version" api "androidx.work:work-runtime-ktx:$work_version"
} }
allOpen {
// allows mocking for classes w/o directly opening them for release builds
annotation 'info.nightscout.interfaces.annotations.InterfacesOpenForTesting'
}

View file

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

View file

@ -1,6 +1,6 @@
package info.nightscout.interfaces package info.nightscout.interfaces
enum class ApsMode() { enum class ApsMode {
OPEN, OPEN,
CLOSED, CLOSED,
LGS, LGS,

View file

@ -5,16 +5,9 @@ package info.nightscout.interfaces
*/ */
object Constants { object Constants {
const val MGDL = "mg/dl" // This is Nightscout's representation
const val MMOL = "mmol"
const val MMOLL_TO_MGDL = 18.0 // 18.0182; const val MMOLL_TO_MGDL = 18.0 // 18.0182;
const val MGDL_TO_MMOLL = 1 / MMOLL_TO_MGDL const val MGDL_TO_MMOLL = 1 / MMOLL_TO_MGDL
const val defaultDIA = 5.0 const val defaultDIA = 5.0
const val REALLYHIGHBASALRATE = 1111111.0
const val REALLYHIGHPERCENTBASALRATE = 1111111
const val REALLYHIGHBOLUS = 1111111.0
const val REALLYHIGHCARBS = 1111111
const val REALLYHIGHIOB = 1111111.0
const val notificationID = 556677 const val notificationID = 556677
// SMS COMMUNICATOR // SMS COMMUNICATOR

View file

@ -1,22 +1,11 @@
package info.nightscout.interfaces.aps package info.nightscout.interfaces.aps
import org.json.JSONObject data class AutosensResult(
class AutosensResult {
//default values to show when autosens algorithm is not called //default values to show when autosens algorithm is not called
var ratio = 1.0 var ratio: Double = 1.0,
var carbsAbsorbed = 0.0 var carbsAbsorbed: Double = 0.0,
var sensResult = "autosens not available" var sensResult: String = "autosens not available",
var pastSensitivity = "" var pastSensitivity: String = "",
var ratioLimit = "" var ratioLimit: String = ""
)
fun json(): JSONObject = JSONObject()
.put("ratio", ratio)
.put("ratioLimit", ratioLimit)
.put("pastSensitivity", pastSensitivity)
.put("sensResult", sensResult)
.put("ratio", ratio)
override fun toString(): String = json().toString()
}

View file

@ -1,16 +1,9 @@
package info.nightscout.interfaces.aps package info.nightscout.interfaces.aps
import info.nightscout.database.entities.DeviceStatus
import info.nightscout.database.entities.OfflineEvent import info.nightscout.database.entities.OfflineEvent
import info.nightscout.interfaces.configBuilder.RunningConfiguration
import info.nightscout.interfaces.constraints.Constraint import info.nightscout.interfaces.constraints.Constraint
import info.nightscout.interfaces.iob.IobCobCalculator
import info.nightscout.interfaces.profile.Profile import info.nightscout.interfaces.profile.Profile
import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.interfaces.pump.Pump
import info.nightscout.interfaces.pump.PumpEnactResult import info.nightscout.interfaces.pump.PumpEnactResult
import info.nightscout.interfaces.receivers.ReceiverStatusStore
import info.nightscout.shared.utils.DateUtil
interface Loop { interface Loop {
@ -47,14 +40,5 @@ interface Loop {
fun goToZeroTemp(durationInMinutes: Int, profile: Profile, reason: OfflineEvent.Reason) fun goToZeroTemp(durationInMinutes: Int, profile: Profile, reason: OfflineEvent.Reason)
fun suspendLoop(durationInMinutes: Int) fun suspendLoop(durationInMinutes: Int)
fun disableCarbSuggestions(durationMinutes: Int) fun disableCarbSuggestions(durationMinutes: Int)
fun buildDeviceStatus( fun buildAndStoreDeviceStatus()
dateUtil: DateUtil,
loop: Loop,
iobCobCalculatorPlugin: IobCobCalculator,
profileFunction: ProfileFunction,
pump: Pump,
receiverStatusStore: ReceiverStatusStore,
runningConfiguration: RunningConfiguration,
version: String
): DeviceStatus?
} }

View file

@ -1,115 +1,18 @@
package info.nightscout.interfaces.constraints package info.nightscout.interfaces.constraints
import info.nightscout.rx.logging.AAPSLogger interface Constraint<T : Comparable<T>> {
import info.nightscout.rx.logging.LTag
class Constraint<T : Comparable<T>>(private var value: T) {
private var originalValue: T
private val reasons: MutableList<String> = ArrayList()
private val mostLimiting: MutableList<String> = ArrayList()
fun value(): T {
return value
}
fun originalValue(): T {
return originalValue
}
fun set(aapsLogger: AAPSLogger, value: T): Constraint<T> {
this.value = value
originalValue = value
aapsLogger.debug(LTag.CONSTRAINTS, "Setting value $value")
return this
}
fun set(aapsLogger: AAPSLogger, value: T, reason: String, from: Any): Constraint<T> {
aapsLogger.debug(LTag.CONSTRAINTS, "Setting value " + this.value + " -> " + value + " (" + reason + ")[" + translateFrom(from) + "]")
this.value = value
addReason(reason, from)
addMostLimingReason(reason, from)
return this
}
fun setIfDifferent(aapsLogger: AAPSLogger, value: T, reason: String, from: Any): Constraint<T> {
if (this.value != value) {
aapsLogger.debug(LTag.CONSTRAINTS, "Setting because of different value " + this.value + " -> " + value + " (" + reason + ")[" + translateFrom(from) + "]")
this.value = value
addReason(reason, from)
addMostLimingReason(reason, from)
}
return this
}
fun setIfSmaller(aapsLogger: AAPSLogger, value: T, reason: String, from: Any): Constraint<T> {
if (value < this.value) {
aapsLogger.debug(LTag.CONSTRAINTS, "Setting because of smaller value " + this.value + " -> " + value + " (" + reason + ")[" + translateFrom(from) + "]")
this.value = value
mostLimiting.clear()
addMostLimingReason(reason, from)
}
if (value < originalValue) {
addReason(reason, from)
}
return this
}
fun setIfGreater(aapsLogger: AAPSLogger, value: T, reason: String, from: Any): Constraint<T> {
if (value > this.value) {
aapsLogger.debug(LTag.CONSTRAINTS, "Setting because of greater value " + this.value + " -> " + value + " (" + reason + ")[" + translateFrom(from) + "]")
this.value = value
mostLimiting.clear()
addMostLimingReason(reason, from)
}
if (value > originalValue) {
addReason(reason, from)
}
return this
}
private fun translateFrom(from: Any): String {
return from.javaClass.simpleName.replace("Plugin", "")
}
fun addReason(reason: String, from: Any) {
reasons.add(translateFrom(from) + ": " + reason)
}
private fun addMostLimingReason(reason: String, from: Any) {
mostLimiting.add(translateFrom(from) + ": " + reason)
}
fun getReasons(aapsLogger: AAPSLogger): String {
val sb = StringBuilder()
for ((count, r) in reasons.withIndex()) {
if (count != 0) sb.append("\n")
sb.append(r)
}
aapsLogger.debug(LTag.CONSTRAINTS, "Limiting original value: $originalValue to $value. Reason: $sb")
return sb.toString()
}
fun value(): T
fun originalValue(): T
fun set(value: T): Constraint<T>
fun set(value: T, reason: String, from: Any): Constraint<T>
fun setIfDifferent(value: T, reason: String, from: Any): Constraint<T>
fun setIfSmaller(value: T, reason: String, from: Any): Constraint<T>
fun setIfGreater(value: T, reason: String, from: Any): Constraint<T>
fun addReason(reason: String, from: Any)
fun getReasons(): String
val reasonList: List<String> val reasonList: List<String>
get() = reasons fun getMostLimitedReasons(): String
fun getMostLimitedReasons(aapsLogger: AAPSLogger): String {
val sb = StringBuilder()
for ((count, r) in mostLimiting.withIndex()) {
if (count != 0) sb.append("\n")
sb.append(r)
}
aapsLogger.debug(LTag.CONSTRAINTS, "Limiting original value: $originalValue to $value. Reason: $sb")
return sb.toString()
}
val mostLimitedReasonList: List<String> val mostLimitedReasonList: List<String>
get() = mostLimiting fun copyReasons(another: Constraint<*>)
fun copyReasons(another: Constraint<*>) {
reasons.addAll(another.reasonList)
}
init {
originalValue = value
}
} }

View file

@ -1,58 +0,0 @@
package info.nightscout.interfaces.constraints
import info.nightscout.interfaces.Constants
import info.nightscout.interfaces.profile.Profile
/**
* Constraints interface
*
* Every function has a param from previous chained call
* Function can limit the value even more and add another reason of restriction
*
* see [info.nightscout.implementation.constraints.ConstraintsImpl]
* which iterates over all registered plugins with [Constraints] implemented
*
* @return updated parameter
*/
interface Constraints {
fun isLoopInvocationAllowed(value: Constraint<Boolean> = Constraint(true)): Constraint<Boolean> = value
fun isClosedLoopAllowed(value: Constraint<Boolean> = Constraint(true)): Constraint<Boolean> = value
fun isLgsAllowed(value: Constraint<Boolean> = Constraint(true)): Constraint<Boolean> = value
fun isAutosensModeEnabled(value: Constraint<Boolean> = Constraint(true)): Constraint<Boolean> = value
fun isSMBModeEnabled(value: Constraint<Boolean> = Constraint(true)): Constraint<Boolean> = value
fun isDynIsfModeEnabled(value: Constraint<Boolean> = Constraint(true)): Constraint<Boolean> = value
fun isUAMEnabled(value: Constraint<Boolean> = Constraint(true)): Constraint<Boolean> = value
fun isAdvancedFilteringEnabled(value: Constraint<Boolean> = Constraint(true)): Constraint<Boolean> = value
fun isSuperBolusEnabled(value: Constraint<Boolean> = Constraint(true)): Constraint<Boolean> = value
fun isAutomationEnabled(value: Constraint<Boolean> = Constraint(true)): Constraint<Boolean> = value
fun applyBasalConstraints(absoluteRate: Constraint<Double>, profile: Profile): Constraint<Double> = absoluteRate
fun applyBasalPercentConstraints(percentRate: Constraint<Int>, profile: Profile): Constraint<Int> = percentRate
fun applyBolusConstraints(insulin: Constraint<Double>): Constraint<Double> = insulin
fun applyExtendedBolusConstraints(insulin: Constraint<Double>): Constraint<Double> = insulin
fun applyCarbsConstraints(carbs: Constraint<Int>): Constraint<Int> = carbs
fun applyMaxIOBConstraints(maxIob: Constraint<Double>): Constraint<Double> = maxIob
/*
* Determine max values by walking through all constraints
*/
fun getMaxBasalAllowed(profile: Profile): Constraint<Double> =
applyBasalConstraints(Constraint(Constants.REALLYHIGHBASALRATE), profile)
fun getMaxBasalPercentAllowed(profile: Profile): Constraint<Int> =
applyBasalPercentConstraints(Constraint(Constants.REALLYHIGHPERCENTBASALRATE), profile)
fun getMaxBolusAllowed(): Constraint<Double> =
applyBolusConstraints(Constraint(Constants.REALLYHIGHBOLUS))
fun getMaxExtendedBolusAllowed(): Constraint<Double> =
applyExtendedBolusConstraints(Constraint(Constants.REALLYHIGHBOLUS))
fun getMaxCarbsAllowed(): Constraint<Int> =
applyCarbsConstraints(Constraint(Constants.REALLYHIGHCARBS))
fun getMaxIOBAllowed(): Constraint<Double> =
applyMaxIOBConstraints(Constraint(Constants.REALLYHIGHIOB))
}

View file

@ -0,0 +1,36 @@
package info.nightscout.interfaces.constraints
import info.nightscout.interfaces.profile.Profile
/**
* Constraints interface
*
* Every function has a param from previous chained call
* Function can limit the value even more and add another reason of restriction
*
* see [info.nightscout.plugins.constraints.ConstraintsCheckerImpl]
* which iterates over all registered plugins with [ConstraintsChecker] implemented
*/
interface ConstraintsChecker : PluginConstraints {
fun isLoopInvocationAllowed(): Constraint<Boolean>
fun isClosedLoopAllowed(): Constraint<Boolean>
fun isLgsAllowed(): Constraint<Boolean>
fun isAutosensModeEnabled(): Constraint<Boolean>
fun isSMBModeEnabled(): Constraint<Boolean>
fun isDynIsfModeEnabled(): Constraint<Boolean>
fun isUAMEnabled(): Constraint<Boolean>
fun isAdvancedFilteringEnabled(): Constraint<Boolean>
fun isSuperBolusEnabled(): Constraint<Boolean>
fun isAutomationEnabled(): Constraint<Boolean>
/*
* Determine max values by walking through all constraints
*/
fun getMaxBasalAllowed(profile: Profile): Constraint<Double>
fun getMaxBasalPercentAllowed(profile: Profile): Constraint<Int>
fun getMaxBolusAllowed(): Constraint<Double>
fun getMaxExtendedBolusAllowed(): Constraint<Double>
fun getMaxCarbsAllowed(): Constraint<Int>
fun getMaxIOBAllowed(): Constraint<Double>
}

View file

@ -0,0 +1,28 @@
package info.nightscout.interfaces.constraints
import info.nightscout.interfaces.profile.Profile
/**
* PluginConstraints interface
*
* Allows to every plugin implement own constraints
*/
interface PluginConstraints {
fun isLoopInvocationAllowed(value: Constraint<Boolean>): Constraint<Boolean> = value
fun isClosedLoopAllowed(value: Constraint<Boolean>): Constraint<Boolean> = value
fun isLgsAllowed(value: Constraint<Boolean>): Constraint<Boolean> = value
fun isAutosensModeEnabled(value: Constraint<Boolean>): Constraint<Boolean> = value
fun isSMBModeEnabled(value: Constraint<Boolean>): Constraint<Boolean> = value
fun isDynIsfModeEnabled(value: Constraint<Boolean>): Constraint<Boolean> = value
fun isUAMEnabled(value: Constraint<Boolean>): Constraint<Boolean> = value
fun isAdvancedFilteringEnabled(value: Constraint<Boolean>): Constraint<Boolean> = value
fun isSuperBolusEnabled(value: Constraint<Boolean>): Constraint<Boolean> = value
fun isAutomationEnabled(value: Constraint<Boolean>): Constraint<Boolean> = value
fun applyBasalConstraints(absoluteRate: Constraint<Double>, profile: Profile): Constraint<Double> = absoluteRate
fun applyBasalPercentConstraints(percentRate: Constraint<Int>, profile: Profile): Constraint<Int> = percentRate
fun applyBolusConstraints(insulin: Constraint<Double>): Constraint<Double> = insulin
fun applyExtendedBolusConstraints(insulin: Constraint<Double>): Constraint<Double> = insulin
fun applyCarbsConstraints(carbs: Constraint<Int>): Constraint<Int> = carbs
fun applyMaxIOBConstraints(maxIob: Constraint<Double>): Constraint<Double> = maxIob
}

View file

@ -1,4 +1,4 @@
package info.nightscout.interfaces.iob package info.nightscout.interfaces.iob
/** All COB up to now, including carbs not yet processed by IobCob calculation. */ /** All COB up to now, including carbs not yet processed by IobCob calculation. */
class CobInfo(val timestamp: Long, val displayCob: Double?, val futureCarbs: Double) data class CobInfo(val timestamp: Long, val displayCob: Double?, val futureCarbs: Double)

View file

@ -0,0 +1,7 @@
package info.nightscout.interfaces.maintenance
import android.os.Parcelable
import kotlinx.parcelize.Parcelize
@Parcelize
data class PrefMetadata(var value: String, var status: PrefsStatus, var info: String? = null) : Parcelable

View file

@ -0,0 +1,11 @@
package info.nightscout.interfaces.maintenance
import android.content.Context
interface PrefsMetadataKey {
val key: String
val icon: Int
val label: Int
fun formatForDisplay(context: Context, value: String): String
}

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