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 {
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 dagger.Module
import dagger.Provides
import info.nightscout.rx.AapsSchedulers
import info.nightscout.rx.bus.RxBus
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.rx.AapsSchedulersImpl
import info.nightscout.shared.impl.rx.bus.RxBusImpl
import info.nightscout.shared.impl.sharedPreferences.SPImplementation
import info.nightscout.shared.sharedPreferences.SP
import info.nightscout.shared.utils.DateUtil
import info.nightscout.shared.utils.DateUtilImpl
import javax.inject.Singleton
@Module(
@ -23,4 +31,20 @@ open class SharedImplModule {
@Provides
@Singleton
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.logging.AAPSLogger
import info.nightscout.rx.logging.LTag
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.rx.AapsSchedulers
import info.nightscout.rx.bus.RxBus
import info.nightscout.rx.events.Event
import info.nightscout.rx.logging.AAPSLogger
import info.nightscout.rx.logging.LTag
@ -12,21 +13,21 @@ import javax.inject.Singleton
@OpenForTesting
@Singleton
class RxBus @Inject constructor(
class RxBusImpl @Inject constructor(
val aapsSchedulers: AapsSchedulers,
val aapsLogger: AAPSLogger
) {
) : RxBus {
private val publisher = PublishSubject.create<Event>()
fun send(event: Event) {
override fun send(event: Event) {
aapsLogger.debug(LTag.EVENTS, "Sending $event")
publisher.onNext(event)
}
// Listen should return an Observable and not the publisher
// 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
.subscribeOn(aapsSchedulers.io)
.ofType(eventType)

View file

@ -5,7 +5,7 @@ import android.os.Build
import androidx.annotation.RequiresApi
import androidx.collection.LongSparseArray
import info.nightscout.annotations.OpenForTesting
import info.nightscout.shared.R
import info.nightscout.interfaces.R
import info.nightscout.shared.SafeParse
import info.nightscout.shared.interfaces.ResourceHelper
import org.apache.commons.lang3.time.DateUtils.isSameDay
@ -40,7 +40,7 @@ import kotlin.math.floor
*/
@OpenForTesting
@Singleton
class DateUtil @Inject constructor(private val context: Context) {
class DateUtilImpl @Inject constructor(private val context: Context) : DateUtil {
/**
* The date format in iso.
@ -55,7 +55,7 @@ class DateUtil @Inject constructor(private val context: Context) {
* @param isoDateString the iso date string
* @return the date
*/
fun fromISODateString(isoDateString: String): Long {
override fun fromISODateString(isoDateString: String): Long {
val parser = ISODateTimeFormat.dateTimeParser()
val dateTime = DateTime.parse(isoDateString, parser)
return dateTime.toDate().time
@ -67,27 +67,27 @@ class DateUtil @Inject constructor(private val context: Context) {
* @param date the date obj
* @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())
f.timeZone = TimeZone.getTimeZone("UTC")
return f.format(date)
}
@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)
format.timeZone = TimeZone.getTimeZone("UTC")
return format.format(timestamp)
}
@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)
format.timeZone = TimeZone.getDefault()
return format.format(timestamp)
}
fun secondsOfTheDayToMilliseconds(seconds: Int): Long {
override fun secondsOfTheDayToMilliseconds(seconds: Int): Long {
val calendar: Calendar = GregorianCalendar()
calendar[Calendar.MONTH] = 0 // Set january to be sure we miss DST changing
calendar[Calendar.HOUR_OF_DAY] = seconds / 60 / 60
@ -96,7 +96,7 @@ class DateUtil @Inject constructor(private val context: Context) {
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 m = p.matcher(hhColonMm)
var retVal = 0
@ -108,12 +108,12 @@ class DateUtil @Inject constructor(private val context: Context) {
return retVal
}
fun dateString(mills: Long): String {
override fun dateString(mills: Long): String {
val df = DateFormat.getDateInstance(DateFormat.SHORT)
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 day = df.format(mills)
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"
if (android.text.format.DateFormat.is24HourFormat(context)) {
format = "dd/MM"
@ -141,8 +141,8 @@ class DateUtil @Inject constructor(private val context: Context) {
return DateTime(mills).toString(DateTimeFormat.forPattern(format))
}
fun timeString(): String = timeString(now())
fun timeString(mills: Long): String {
override fun timeString(): String = timeString(now())
override fun timeString(mills: Long): String {
var format = "hh:mma"
if (android.text.format.DateFormat.is24HourFormat(context)) {
format = "HH:mm"
@ -150,16 +150,16 @@ class DateUtil @Inject constructor(private val context: Context) {
return DateTime(mills).toString(DateTimeFormat.forPattern(format))
}
fun secondString(): String = secondString(now())
fun secondString(mills: Long): String =
override fun secondString(): String = secondString(now())
override fun secondString(mills: Long): String =
DateTime(mills).toString(DateTimeFormat.forPattern("ss"))
fun minuteString(): String = minuteString(now())
fun minuteString(mills: Long): String =
override fun minuteString(): String = minuteString(now())
override fun minuteString(mills: Long): String =
DateTime(mills).toString(DateTimeFormat.forPattern("mm"))
fun hourString(): String = hourString(now())
fun hourString(mills: Long): String {
override fun hourString(): String = hourString(now())
override fun hourString(mills: Long): String {
var format = "hh"
if (android.text.format.DateFormat.is24HourFormat(context)) {
format = "HH"
@ -167,27 +167,27 @@ class DateUtil @Inject constructor(private val context: Context) {
return DateTime(mills).toString(DateTimeFormat.forPattern(format))
}
fun amPm(): String = amPm(now())
fun amPm(mills: Long): String =
override fun amPm(): String = amPm(now())
override fun amPm(mills: Long): String =
DateTime(mills).toString(DateTimeFormat.forPattern("a"))
fun dayNameString(format: String = "E"): String = dayNameString(now(), format)
fun dayNameString(mills: Long, format: String = "E"): String =
override fun dayNameString(format: String): String = dayNameString(now(), format)
override fun dayNameString(mills: Long, format: String): String =
DateTime(mills).toString(DateTimeFormat.forPattern(format))
fun dayString(): String = dayString(now())
fun dayString(mills: Long): String =
override fun dayString(): String = dayString(now())
override fun dayString(mills: Long): String =
DateTime(mills).toString(DateTimeFormat.forPattern("dd"))
fun monthString(format: String = "MMM"): String = monthString(now(), format)
fun monthString(mills: Long, format: String = "MMM"): String =
override fun monthString(format: String): String = monthString(now(), format)
override fun monthString(mills: Long, format: String): String =
DateTime(mills).toString(DateTimeFormat.forPattern(format))
fun weekString(): String = weekString(now())
fun weekString(mills: Long): String =
override fun weekString(): String = weekString(now())
override fun weekString(mills: Long): String =
DateTime(mills).toString(DateTimeFormat.forPattern("ww"))
fun timeStringWithSeconds(mills: Long): String {
override fun timeStringWithSeconds(mills: Long): String {
var format = "hh:mm:ssa"
if (android.text.format.DateFormat.is24HourFormat(context)) {
format = "HH:mm:ss"
@ -195,46 +195,46 @@ class DateUtil @Inject constructor(private val context: Context) {
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)
}
fun timeRangeString(start: Long, end: Long): String {
override fun timeRangeString(start: Long, end: Long): String {
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)
}
fun dateAndTimeAndSecondsString(mills: Long): String {
override fun dateAndTimeAndSecondsString(mills: Long): String {
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 ""
val minutes = ((now() - time) / 1000 / 60).toInt()
return rh.gs(R.string.minago, minutes)
}
fun minAgoShort(time: Long?): String {
override fun minAgoShort(time: Long?): String {
if (time == null) return ""
val minutes = ((time - now()) / 1000 / 60).toInt()
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 ""
val minutes = ((now() - time) / 1000 / 60).toInt()
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
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
if (round) {
return if (now() > time) {
@ -251,7 +251,7 @@ class DateUtil @Inject constructor(private val context: Context) {
rh.gs(R.string.in_days, days)
}
fun beginOfDay(mills: Long): Long {
override fun beginOfDay(mills: Long): Long {
val givenDate = Calendar.getInstance()
givenDate.timeInMillis = mills
givenDate[Calendar.HOUR_OF_DAY] = 0
@ -261,7 +261,7 @@ class DateUtil @Inject constructor(private val context: Context) {
return givenDate.timeInMillis
}
fun timeStringFromSeconds(seconds: Int): String {
override fun timeStringFromSeconds(seconds: Int): String {
val cached = timeStrings[seconds.toLong()]
if (cached != null) return cached
val t = timeString(secondsOfTheDayToMilliseconds(seconds))
@ -269,47 +269,47 @@ class DateUtil @Inject constructor(private val context: Context) {
return t
}
fun timeFrameString(timeInMillis: Long, rh: ResourceHelper): String {
override fun timeFrameString(timeInMillis: Long, rh: ResourceHelper): String {
var remainingTimeMinutes = timeInMillis / (1000 * 60)
val remainingTimeHours = remainingTimeMinutes / 60
remainingTimeMinutes %= 60
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)
}
fun untilString(timestamp: Long, rh: ResourceHelper): String {
override fun untilString(timestamp: Long, rh: ResourceHelper): String {
return timeFrameString(timestamp - System.currentTimeMillis(), rh)
}
fun now(): Long {
override fun now(): Long {
return System.currentTimeMillis()
}
fun nowWithoutMilliseconds(): Long {
override fun nowWithoutMilliseconds(): Long {
var n = System.currentTimeMillis()
n -= n % 1000
return n
}
fun isOlderThan(date: Long, minutes: Long): Boolean {
override fun isOlderThan(date: Long, minutes: Long): Boolean {
val diff = now() - date
return diff > T.mins(minutes).msecs()
}
fun getTimeZoneOffsetMs(): Long {
override fun getTimeZoneOffsetMs(): Long {
return GregorianCalendar().timeZone.rawOffset.toLong()
}
fun getTimeZoneOffsetMinutes(timestamp: Long): Int {
override fun getTimeZoneOffsetMinutes(timestamp: Long): Int {
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()
if (now in (timestamp1 + 1) until timestamp2 || now in (timestamp2 + 1) until timestamp1)
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}
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))
units.reverse()
val result: MutableMap<TimeUnit, Long> = LinkedHashMap()
@ -331,7 +331,7 @@ class DateUtil @Inject constructor(private val context: Context) {
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)
var days = " " + rh.gs(R.string.days) + " "
var hours = " " + rh.gs(R.string.hours) + " "
@ -348,7 +348,7 @@ class DateUtil @Inject constructor(private val context: Context) {
return result
}
fun niceTimeScalar(time: Long, rh: ResourceHelper): String {
override fun niceTimeScalar(time: Long, rh: ResourceHelper): String {
var t = time
var unit = rh.gs(R.string.unit_second)
t /= 1000
@ -378,7 +378,7 @@ class DateUtil @Inject constructor(private val context: Context) {
return qs(t.toDouble(), 0) + " " + unit
}
fun qs(x: Double, numDigits: Int): String {
override fun qs(x: Double, numDigits: Int): String {
var digits = numDigits
if (digits == -1) {
digits = 0
@ -411,7 +411,7 @@ class DateUtil @Inject constructor(private val context: Context) {
return thisDf?.format(x) ?: ""
}
fun formatHHMM(timeAsSeconds: Int): String {
override fun formatHHMM(timeAsSeconds: Int): String {
val hour = timeAsSeconds / 60 / 60
val minutes = (timeAsSeconds - hour * 60 * 60) / 60
val df = DecimalFormat("00")
@ -419,7 +419,7 @@ class DateUtil @Inject constructor(private val context: Context) {
}
@RequiresApi(Build.VERSION_CODES.O)
fun timeZoneByOffset(offsetInMilliseconds: Long): TimeZone =
override fun timeZoneByOffset(offsetInMilliseconds: Long): TimeZone =
TimeZone.getTimeZone(
if (offsetInMilliseconds == 0L) ZoneId.of("UTC")
else ZoneId.getAvailableZoneIds()
@ -430,7 +430,7 @@ class DateUtil @Inject constructor(private val context: Context) {
.firstOrNull() ?: ZoneId.of("UTC")
)
fun timeStampToUtcDateMillis(timestamp: Long): Long {
override fun timeStampToUtcDateMillis(timestamp: Long): Long {
val current = Calendar.getInstance().apply { timeInMillis = timestamp }
return Calendar.getInstance().apply {
set(Calendar.YEAR, current[Calendar.YEAR])
@ -439,7 +439,7 @@ class DateUtil @Inject constructor(private val context: Context) {
}.timeInMillis
}
fun mergeUtcDateToTimestamp(timestamp: Long, dateUtcMillis: Long): Long {
override fun mergeUtcDateToTimestamp(timestamp: Long, dateUtcMillis: Long): Long {
val selected = Calendar.getInstance().apply { timeInMillis = dateUtcMillis }
return Calendar.getInstance().apply {
timeInMillis = timestamp
@ -449,7 +449,7 @@ class DateUtil @Inject constructor(private val context: Context) {
}.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 {
timeInMillis = timestamp
set(Calendar.HOUR_OF_DAY, hour)

View file

@ -3,7 +3,7 @@
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FF000000"
android:pathData="M0.103,0h24v24h-24z"/>
<path
android:fillColor="#FF000000"
android:pathData="M0.103,0h24v24h-24z" />
</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
import com.google.common.truth.Truth.assertThat
import info.nightscout.rx.logging.LTag
import info.nightscout.shared.sharedPreferences.SP
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
@ -26,13 +26,13 @@ class LImplTest {
@Test
fun findByName() {
Assertions.assertEquals(LTag.APS.name, sut.findByName("APS").name)
Assertions.assertEquals("NONEXISTENT", sut.findByName("APS2").name)
assertThat(sut.findByName("APS").name).isEqualTo(LTag.APS.name)
assertThat(sut.findByName("APS2").name).isEqualTo("NONEXISTENT")
}
@Test
fun getLogElements() {
Assertions.assertTrue(sut.getLogElements().isNotEmpty())
assertThat(sut.getLogElements()).isNotEmpty()
}
@Test
@ -40,6 +40,6 @@ class LImplTest {
val element = sut.findByName("APS")
element.enabled = false
sut.resetToDefaults()
Assertions.assertTrue(element.enabled)
assertThat(element.enabled).isTrue()
}
}
}

View file

@ -1,8 +1,8 @@
package info.nightscout.shared.impl.sharedPreferences
import com.google.common.truth.Truth.assertThat
import android.content.Context
import info.nightscout.shared.impl.SharedPreferencesMock
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
@ -34,153 +34,153 @@ class SPImplementationTest {
@Test
fun edit() {
sut.edit { putBoolean("test", true) }
Assertions.assertTrue(sut.getBoolean("test", false))
assertThat(sut.getBoolean("test", false)).isTrue()
sut.edit { remove("test") }
Assertions.assertFalse(sut.contains("test"))
assertThat(sut.contains("test")).isFalse()
sut.edit { putBoolean(someResource, true) }
Assertions.assertTrue(sut.getBoolean(someResource, false))
assertThat(sut.getBoolean(someResource, false)).isTrue()
sut.edit { remove(someResource) }
Assertions.assertFalse(sut.contains(someResource))
assertThat(sut.contains(someResource)).isFalse()
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) }
Assertions.assertEquals(1.0, sut.getDouble(someResource, 2.0))
assertThat(sut.getDouble(someResource, 2.0)).isEqualTo(1.0)
sut.edit { clear() }
Assertions.assertFalse(sut.contains(someResource2))
assertThat(sut.contains(someResource2)).isFalse()
sut.edit { putInt("test", 1) }
Assertions.assertEquals(1, sut.getInt("test", 2))
assertThat(sut.getInt("test", 2)).isEqualTo(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 { putLong("test", 1L) }
Assertions.assertEquals(1L, sut.getLong("test", 2L))
assertThat(sut.getLong("test", 2L)).isEqualTo(1L)
sut.edit { putLong(someResource, 1) }
Assertions.assertEquals(1L, sut.getLong(someResource, 2L))
assertThat(sut.getLong(someResource, 2L)).isEqualTo(1L)
sut.edit { clear() }
sut.edit { putString("test", "string") }
Assertions.assertEquals("string", sut.getString("test", "a"))
assertThat(sut.getString("test", "a")).isEqualTo("string")
sut.edit { putString(someResource, "string") }
Assertions.assertEquals("string", sut.getString(someResource, "a"))
assertThat(sut.getString(someResource, "a")).isEqualTo("string")
sut.edit { clear() }
}
@Test
fun clear() {
sut.putBoolean("test", true)
Assertions.assertTrue(sut.getAll().containsKey("test"))
assertThat(sut.getAll()).containsKey("test")
sut.clear()
Assertions.assertFalse(sut.getAll().containsKey("test"))
assertThat(sut.getAll()).doesNotContainKey("test")
}
@Test
fun contains() {
sut.putBoolean("test", true)
Assertions.assertTrue(sut.contains("test"))
assertThat(sut.contains("test")).isTrue()
sut.putBoolean(someResource, true)
Assertions.assertTrue(sut.contains(someResource))
assertThat(sut.contains(someResource)).isTrue()
}
@Test
fun remove() {
sut.putBoolean("test", true)
sut.remove("test")
Assertions.assertFalse(sut.contains("test"))
assertThat(sut.contains("test")).isFalse()
sut.putBoolean(someResource, true)
sut.remove(someResource)
Assertions.assertFalse(sut.contains(someResource))
assertThat(sut.contains(someResource)).isFalse()
}
@Test
fun getString() {
sut.putString("test", "string")
Assertions.assertTrue(sut.getString("test", "") == "string")
Assertions.assertTrue(sut.getString("test1", "") == "")
assertThat(sut.getString("test", "")).isEqualTo("string")
assertThat(sut.getString("test1", "")).isEmpty()
sut.putString(someResource, "string")
Assertions.assertTrue(sut.getString(someResource, "") == "string")
Assertions.assertTrue(sut.getString(someResource2, "") == "")
assertThat(sut.getString(someResource, "")).isEqualTo("string")
assertThat(sut.getString(someResource2, "")).isEmpty()
}
@Test
fun getStringOrNull() {
sut.putString("test", "string")
Assertions.assertTrue(sut.getStringOrNull("test", "") == "string")
Assertions.assertNull(sut.getStringOrNull("test1", null))
assertThat(sut.getStringOrNull("test", "")).isEqualTo("string")
assertThat(sut.getStringOrNull("test1", null)).isNull()
sut.putString(someResource, "string")
Assertions.assertTrue(sut.getStringOrNull(someResource, null) == "string")
Assertions.assertNull(sut.getStringOrNull(someResource2, null))
assertThat(sut.getStringOrNull(someResource, null)).isEqualTo("string")
assertThat(sut.getStringOrNull(someResource2, null)).isNull()
}
@Test
fun getBoolean() {
sut.putBoolean("test", true)
Assertions.assertTrue(sut.getBoolean("test", false))
assertThat(sut.getBoolean("test", false)).isTrue()
sut.putBoolean(someResource, true)
Assertions.assertTrue(sut.getBoolean(someResource, false))
assertThat(sut.getBoolean(someResource, false)).isTrue()
sut.putString("string_key", "a")
Assertions.assertTrue(sut.getBoolean("string_key", true))
assertThat(sut.getBoolean("string_key", true)).isTrue()
sut.putString(someResource, "a")
Assertions.assertTrue(sut.getBoolean(someResource, true))
assertThat(sut.getBoolean(someResource, true)).isTrue()
}
@Test
fun getDouble() {
sut.putDouble("test", 1.0)
Assertions.assertEquals(1.0, sut.getDouble("test", 2.0))
Assertions.assertEquals(2.0, sut.getDouble("test1", 2.0))
assertThat(sut.getDouble("test", 2.0)).isEqualTo(1.0)
assertThat(sut.getDouble("test1", 2.0)).isEqualTo(2.0)
sut.putDouble(someResource, 1.0)
Assertions.assertEquals(1.0, sut.getDouble(someResource, 2.0))
Assertions.assertEquals(2.0, sut.getDouble(someResource2, 2.0))
assertThat(sut.getDouble(someResource, 2.0)).isEqualTo(1.0)
assertThat(sut.getDouble(someResource2, 2.0)).isEqualTo(2.0)
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")
Assertions.assertEquals(1.0, sut.getDouble(someResource, 1.0))
assertThat(sut.getDouble(someResource, 1.0)).isEqualTo(1.0)
}
@Test
fun getInt() {
sut.putInt("test", 1)
Assertions.assertEquals(1, sut.getInt("test", 2))
Assertions.assertEquals(2, sut.getInt("test1", 2))
assertThat(sut.getInt("test", 2)).isEqualTo(1)
assertThat(sut.getInt("test1", 2)).isEqualTo(2)
sut.putInt(someResource, 1)
Assertions.assertEquals(1, sut.getInt(someResource, 2))
Assertions.assertEquals(2, sut.getInt(someResource2, 2))
assertThat(sut.getInt(someResource, 2)).isEqualTo(1)
assertThat(sut.getInt(someResource2, 2)).isEqualTo(2)
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")
Assertions.assertEquals(1, sut.getInt(someResource, 1))
assertThat(sut.getInt(someResource, 1)).isEqualTo(1)
}
@Test
fun getLong() {
sut.putLong("test", 1L)
Assertions.assertEquals(1L, sut.getLong("test", 2L))
Assertions.assertEquals(2L, sut.getLong("test1", 2L))
assertThat(sut.getLong("test", 2L)).isEqualTo(1L)
assertThat(sut.getLong("test1", 2L)).isEqualTo(2L)
sut.putLong(someResource, 1L)
Assertions.assertEquals(1L, sut.getLong(someResource, 2L))
Assertions.assertEquals(2L, sut.getLong(someResource2, 2L))
assertThat(sut.getLong(someResource, 2L)).isEqualTo(1L)
assertThat(sut.getLong(someResource2, 2L)).isEqualTo(2L)
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")
Assertions.assertEquals(1L, sut.getLong(someResource, 1L))
assertThat(sut.getLong(someResource, 1L)).isEqualTo(1L)
}
@Test
fun incLong() {
sut.incLong(someResource)
Assertions.assertEquals(1L, sut.getLong(someResource, 3L))
assertThat(sut.getLong(someResource, 3L)).isEqualTo(1L)
sut.incLong(someResource)
Assertions.assertEquals(2L, sut.getLong(someResource, 3L))
assertThat(sut.getLong(someResource, 3L)).isEqualTo(2L)
}
@Test
fun incInt() {
sut.incInt(someResource)
Assertions.assertEquals(1, sut.getInt(someResource, 3))
assertThat(sut.getInt(someResource, 3)).isEqualTo(1)
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 {
namespace 'info.nightscout.sharedtests'
}
}
dependencies {
implementation project(':database:entities')
implementation project(':app-wear-shared:shared')
implementation project(':app-wear-shared:shared-impl')
implementation project(':core:interfaces')
implementation project(':core:main')
implementation project(':core:utils')
implementation project(':implementation')
api "org.mockito:mockito-junit-jupiter:$mockito_version"
api "org.mockito.kotlin:mockito-kotlin:5.1.0"
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.

View file

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

View file

@ -19,11 +19,11 @@ import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.interfaces.profile.ProfileStore
import info.nightscout.interfaces.utils.DecimalFormatter
import info.nightscout.interfaces.utils.HardLimits
import info.nightscout.rx.bus.RxBus
import info.nightscout.shared.interfaces.ProfileUtil
import info.nightscout.shared.interfaces.ResourceHelper
import info.nightscout.shared.sharedPreferences.SP
import info.nightscout.shared.utils.DateUtil
import info.nightscout.shared.utils.DateUtilImpl
import org.json.JSONObject
import org.junit.jupiter.api.BeforeEach
import org.mockito.ArgumentMatchers.anyDouble
@ -49,7 +49,6 @@ open class TestBaseWithProfile : TestBase() {
lateinit var profileUtil: ProfileUtil
lateinit var decimalFormatter: DecimalFormatter
lateinit var hardLimits: HardLimits
val rxBus = RxBus(aapsSchedulers, aapsLogger)
val profileInjector = HasAndroidInjector {
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\"}," +
"{\"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\"}"
dateUtil = Mockito.spy(DateUtil(context))
dateUtil = Mockito.spy(DateUtilImpl(context))
decimalFormatter = DecimalFormatterImpl(rh)
profileUtil = ProfileUtilImpl(sp, decimalFormatter)
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
// https://github.com/nightscout/graphview.git
// https://github.com/nightscout/iconify.git
implementation project(':app-wear-shared:shared')
implementation project(':app-wear-shared:shared-impl')
implementation project(':core:main')
implementation project(':core:graphview')
@ -216,7 +215,6 @@ dependencies {
implementation project(':insight')
implementation project(':pump:medtronic')
implementation project(':pump:pump-common')
implementation project(':pump:pump-core')
implementation project(':pump:omnipod-common')
implementation project(':pump:omnipod-eros')
implementation project(':pump:omnipod-dash')

View file

@ -1,102 +1,98 @@
package info.nightscout.androidaps
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
import org.junit.runner.RunWith
@LargeTest
@RunWith(AndroidJUnit4::class)
//@LargeTest
//@RunWith(AndroidJUnit4::class)
class RealPumpTest {
/*
companion object {
const val R_PASSWORD = 1234
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)
/*
companion object {
const val R_PASSWORD = 1234
const val R_SERIAL = "PBB00013LR_P"
}
while (true) {
//log.debug("Tick")
SystemClock.sleep(1000)
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), 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
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
import org.junit.runner.RunWith
@LargeTest
@RunWith(AndroidJUnit4::class)
//@LargeTest
//@RunWith(AndroidJUnit4::class)
class SetupWizardActivityTest {
/*
@Rule
@JvmField
var mActivityTestRule = ActivityTestRule(SetupWizardActivity::class.java)
/*
@Rule
@JvmField
var mActivityTestRule = ActivityTestRule(SetupWizardActivity::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
)
@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()
}
/*
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())
@Before
fun clear() {
sp.clear()
}
// Store permission
askButton = onView(withText("Ask for permission"))
if (askButton.isDisplayed()) {
askButton.perform(scrollTo(), click())
onView(withText("OK")).perform(click())
/*
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())
}
// Import settings : skip of found
askButton = onView(withText("IMPORT SETTINGS"))
if (askButton.isDisplayed()) {
// Agreement page
onView(withText("I UNDERSTAND AND AGREE")).perform(scrollTo(), click())
onView(withId(R.id.next_button)).waitAndPerform(click())
}
// Units selection
onView(withText("mmol/L")).perform(scrollTo(), click())
onView(withId(R.id.next_button)).perform(click())
// Display target selection
onView(withText("4.2")).perform(scrollTo(), ViewActions.replaceText("5"))
onView(withText("10.0")).perform(scrollTo(), ViewActions.replaceText("11"))
onView(withId(R.id.next_button)).perform(click())
// NSClient
onView(withId(R.id.next_button)).perform(click())
// Age selection
onView(withText("Adult")).perform(scrollTo(), click())
onView(withId(R.id.next_button)).waitAndPerform(click())
// Insulin selection
onView(withText("Ultra-Rapid Oref")).perform(scrollTo(), click())
onView(withId(R.id.next_button)).waitAndPerform(click())
// BG source selection
onView(withText("Random BG")).perform(scrollTo(), click())
onView(withId(R.id.next_button)).waitAndPerform(click())
// Profile selection
onView(withText("Local Profile")).perform(scrollTo(), click())
onView(withId(R.id.next_button)).waitAndPerform(click())
// Local profile - DIA
onView(withTagValue(Matchers.`is`("LP_DIA"))).perform(scrollTo(), ViewActions.replaceText("6.0"))
// Local profile - IC
onView(withId(R.id.ic_tab)).perform(scrollTo(), click())
onView(Matchers.allOf(withTagValue(Matchers.`is`("IC-1-0")), isDisplayed()))
.perform(ViewActions.replaceText("2"), ViewActions.closeSoftKeyboard())
// Local profile - ISF
onView(withId(R.id.isf_tab)).perform(scrollTo(), click())
onView(Matchers.allOf(withTagValue(Matchers.`is`("ISF-1-0")), isDisplayed()))
.perform(ViewActions.replaceText("3"), ViewActions.closeSoftKeyboard())
// Local profile - BAS
onView(withId(R.id.basal_tab)).perform(scrollTo(), click())
onView(childAtPosition(Matchers.allOf(withId(R.id.localprofile_basal), childAtPosition(withClassName(Matchers.`is`("android.widget.LinearLayout")), 6)), 2))
.perform(scrollTo(), click())
onView(Matchers.allOf(withTagValue(Matchers.`is`("BASAL-1-0")), isDisplayed()))
.perform(ViewActions.replaceText("1.1"), ViewActions.closeSoftKeyboard())
onView(Matchers.allOf(withTagValue(Matchers.`is`("BASAL-1-1")), isDisplayed()))
.perform(ViewActions.replaceText("1.2"), ViewActions.closeSoftKeyboard())
onView(Matchers.allOf(withId(R.id.timelistedit_time), childAtPosition(childAtPosition(withId(R.id.localprofile_basal), 2), 0)))
.perform(scrollTo(), click())
onData(Matchers.anything()).inAdapterView(childAtPosition(withClassName(Matchers.`is`("android.widget.PopupWindow\$PopupBackgroundView")), 0)).atPosition(13)
.perform(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())
// confirm dialog
//onView(Matchers.allOf(withText("OK"), isDisplayed())).perform(click()) not working on real phone
clickOkInDialog()
onView(withId(R.id.next_button)).waitAndPerform(click())
// Profile switch
askButton = onView(withText("Do Profile Switch"))
if (askButton.isDisplayed()) {
askButton.perform(scrollTo(), 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()) {
askButton.perform(scrollTo(), click())
onView(withText("OK")).perform(click())
onView(withId(R.id.next_button)).waitAndPerform(click())
}
// Import settings : skip of found
askButton = onView(withText("IMPORT SETTINGS"))
if (askButton.isDisplayed()) {
onView(withId(R.id.next_button)).waitAndPerform(click())
}
// Units selection
onView(withText("mmol/L")).perform(scrollTo(), click())
onView(withId(R.id.next_button)).perform(click())
// Display target selection
onView(withText("4.2")).perform(scrollTo(), ViewActions.replaceText("5"))
onView(withText("10.0")).perform(scrollTo(), ViewActions.replaceText("11"))
onView(withId(R.id.next_button)).perform(click())
// NSClient
onView(withId(R.id.next_button)).perform(click())
// Age selection
onView(withText("Adult")).perform(scrollTo(), click())
onView(withId(R.id.next_button)).waitAndPerform(click())
// Insulin selection
onView(withText("Ultra-Rapid Oref")).perform(scrollTo(), click())
onView(withId(R.id.next_button)).waitAndPerform(click())
// BG source selection
onView(withText("Random BG")).perform(scrollTo(), click())
onView(withId(R.id.next_button)).waitAndPerform(click())
// Profile selection
onView(withText("Local Profile")).perform(scrollTo(), click())
onView(withId(R.id.next_button)).waitAndPerform(click())
// Local profile - DIA
onView(withTagValue(Matchers.`is`("LP_DIA"))).perform(scrollTo(), ViewActions.replaceText("6.0"))
// Local profile - IC
onView(withId(R.id.ic_tab)).perform(scrollTo(), click())
onView(Matchers.allOf(withTagValue(Matchers.`is`("IC-1-0")), isDisplayed()))
.perform(ViewActions.replaceText("2"), ViewActions.closeSoftKeyboard())
// Local profile - ISF
onView(withId(R.id.isf_tab)).perform(scrollTo(), click())
onView(Matchers.allOf(withTagValue(Matchers.`is`("ISF-1-0")), isDisplayed()))
.perform(ViewActions.replaceText("3"), ViewActions.closeSoftKeyboard())
// Local profile - BAS
onView(withId(R.id.basal_tab)).perform(scrollTo(), click())
onView(childAtPosition(Matchers.allOf(withId(R.id.localprofile_basal), childAtPosition(withClassName(Matchers.`is`("android.widget.LinearLayout")), 6)), 2))
.perform(scrollTo(), click())
onView(Matchers.allOf(withTagValue(Matchers.`is`("BASAL-1-0")), isDisplayed()))
.perform(ViewActions.replaceText("1.1"), ViewActions.closeSoftKeyboard())
onView(Matchers.allOf(withTagValue(Matchers.`is`("BASAL-1-1")), isDisplayed()))
.perform(ViewActions.replaceText("1.2"), ViewActions.closeSoftKeyboard())
onView(Matchers.allOf(withId(R.id.timelistedit_time), childAtPosition(childAtPosition(withId(R.id.localprofile_basal), 2), 0)))
.perform(scrollTo(), click())
onData(Matchers.anything()).inAdapterView(childAtPosition(withClassName(Matchers.`is`("android.widget.PopupWindow\$PopupBackgroundView")), 0)).atPosition(13)
.perform(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(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()
while (ProfileFunctions.getInstance().profile == null) SystemClock.sleep(100)
onView(withId(R.id.next_button)).waitAndPerform(click())
}
// 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())
// 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)
// Profile switch
askButton = onView(withText("Do Profile Switch"))
if (askButton.isDisplayed()) {
askButton.perform(scrollTo(), click())
onView(allOf(withId(R.id.ok), isDisplayed())).perform(click())
// onView(Matchers.allOf(withText("OK"), isDisplayed())).perform(click()) not working on real phone
clickOkInDialog()
while (ProfileFunctions.getInstance().profile == null) SystemClock.sleep(100)
onView(withId(R.id.next_button)).waitAndPerform(click())
}
// 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 {
val parent = view.parent
return parent is ViewGroup && parentMatcher.matches(parent)
&& view == parent.getChildAt(position)
// Verify settings
Assert.assertEquals(GlucoseUnit.MMOL.asText, 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)
}
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.Config
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.maintenance.PrefFileListProvider
import info.nightscout.interfaces.plugin.ActivePlugin
import info.nightscout.interfaces.plugin.PluginBase
import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.interfaces.protection.ProtectionCheck
import info.nightscout.interfaces.smsCommunicator.SmsCommunicator
@ -96,7 +95,7 @@ class MainActivity : DaggerAppCompatActivityWithResult() {
@Inject lateinit var fabricPrivacy: FabricPrivacy
@Inject lateinit var protectionCheck: ProtectionCheck
@Inject lateinit var iconsProvider: IconsProvider
@Inject lateinit var constraintChecker: Constraints
@Inject lateinit var constraintChecker: ConstraintsChecker
@Inject lateinit var signatureVerifierPlugin: SignatureVerifierPlugin
@Inject lateinit var uel: UserEntryLogger
@Inject lateinit var profileFunction: ProfileFunction
@ -283,7 +282,7 @@ class MainActivity : DaggerAppCompatActivityWithResult() {
private fun start() {
binding.splash.visibility = View.GONE
//Check here if loop plugin is disabled. Else check via constraints
if (!(loop as PluginBase).isEnabled()) versionCheckerUtils.triggerCheckVersion()
if (!loop.isEnabled()) versionCheckerUtils.triggerCheckVersion()
setUserStats()
setupViews()

View file

@ -38,6 +38,7 @@ import info.nightscout.interfaces.notifications.Notification
import info.nightscout.interfaces.plugin.PluginBase
import info.nightscout.interfaces.ui.UiInteraction
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.themes.ThemeSwitcherPlugin
import info.nightscout.rx.logging.AAPSLogger
@ -77,7 +78,7 @@ class MainApp : DaggerApplication() {
@Inject lateinit var compatDBHelper: CompatDBHelper
@Inject lateinit var repository: AppRepository
@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 uiInteraction: UiInteraction
@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.insight.di.InsightDatabaseModule
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.eopatch.dagger.EopatchModule
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.constraints.di.PluginsConstraintsModule
import info.nightscout.plugins.di.PluginsModule
import info.nightscout.plugins.sync.di.OpenHumansModule
import info.nightscout.plugins.sync.di.SyncModule
import info.nightscout.pump.combo.di.ComboModule
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.DanaModule
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.medtrum.di.MedtrumModule
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.source.di.SourceModule
import info.nightscout.ui.di.UiModule
@ -62,8 +60,6 @@ import javax.inject.Singleton
InsulinModule::class,
OpenHumansModule::class,
PluginsModule::class,
RxModule::class,
SharedModule::class,
SharedImplModule::class,
UiModule::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.workDataOf
import com.google.common.util.concurrent.ListenableFuture
import info.nightscout.androidaps.BuildConfig
import info.nightscout.androidaps.R
import info.nightscout.configuration.maintenance.MaintenancePlugin
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.LocalAlertUtils
import info.nightscout.interfaces.aps.Loop
import info.nightscout.interfaces.configBuilder.RunningConfiguration
import info.nightscout.interfaces.iob.IobCobCalculator
import info.nightscout.interfaces.plugin.ActivePlugin
import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.interfaces.queue.Command
import info.nightscout.interfaces.queue.CommandQueue
import info.nightscout.interfaces.receivers.ReceiverStatusStore
import info.nightscout.rx.bus.RxBus
import info.nightscout.rx.events.EventProfileSwitchChanged
import info.nightscout.rx.logging.LTag
@ -51,8 +48,6 @@ class KeepAliveWorker(
@Inject lateinit var dateUtil: DateUtil
@Inject lateinit var activePlugin: ActivePlugin
@Inject lateinit var profileFunction: ProfileFunction
@Inject lateinit var runningConfiguration: RunningConfiguration
@Inject lateinit var receiverStatusStore: ReceiverStatusStore
@Inject lateinit var rxBus: RxBus
@Inject lateinit var commandQueue: CommandQueue
@Inject lateinit var maintenancePlugin: MaintenancePlugin
@ -155,13 +150,7 @@ class KeepAliveWorker(
else if (dateUtil.isOlderThan(activePlugin.activeAPS.lastAPSRun, 5)) shouldUploadStatus = true
if (dateUtil.isOlderThan(lastIobUpload, IOB_UPDATE_FREQUENCY_IN_MINUTES) && shouldUploadStatus) {
lastIobUpload = dateUtil.now()
loop.buildDeviceStatus(
dateUtil, loop, iobCobCalculator, profileFunction,
activePlugin.activePump, receiverStatusStore, runningConfiguration,
BuildConfig.VERSION_NAME + "-" + BuildConfig.BUILDVERSION
)?.also {
repository.insert(it)
}
loop.buildAndStoreDeviceStatus()
}
}
@ -193,8 +182,8 @@ class KeepAliveWorker(
// do nothing if pump is disconnected
} else if (runningProfile == null || ((!pump.isThisProfileSet(requestedProfile) || !requestedProfile.isEqual(runningProfile)
|| (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())
} else if (isStatusOutdated && !pump.isBusy()) {
lastReadStatus = now

View file

@ -121,12 +121,12 @@ class CalculationWorkflowImpl @Inject constructor(
}
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)
val workStatus = WorkManager.getInstance(context).getWorkInfosForUniqueWork(job).get()
while (workStatus.size >= 1 && workStatus[0].state == WorkInfo.State.RUNNING)
SystemClock.sleep(100)
aapsLogger.debug(LTag.AUTOSENS, "Calculation thread stopped: $from")
aapsLogger.debug(LTag.WORKER, "Calculation thread stopped: $from")
}
override fun runCalculation(
@ -138,7 +138,7 @@ class CalculationWorkflowImpl @Inject constructor(
bgDataReload: Boolean,
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)
.beginUniqueWork(

View file

@ -11,6 +11,7 @@
<string name="save">Сохранить</string>
<string name="reloadprofile">обновить профиль</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="wear">Смарт-часы Wear</string>
<string name="nav_about">о приложении</string>

View file

@ -2,14 +2,14 @@ package info.nightscout.plugins.aps.loop
import android.app.NotificationManager
import android.content.Context
import com.google.common.truth.Truth.assertThat
import dagger.android.AndroidInjector
import dagger.android.HasAndroidInjector
import info.nightscout.core.utils.fabric.FabricPrivacy
import info.nightscout.database.impl.AppRepository
import info.nightscout.interfaces.ApsMode
import info.nightscout.interfaces.Config
import info.nightscout.interfaces.configBuilder.RunningConfiguration
import info.nightscout.interfaces.constraints.Constraints
import info.nightscout.interfaces.constraints.ConstraintsChecker
import info.nightscout.interfaces.iob.IobCobCalculator
import info.nightscout.interfaces.logging.UserEntryLogger
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.ui.UiInteraction
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.sharedPreferences.SP
import info.nightscout.shared.utils.DateUtil
import info.nightscout.sharedtests.TestBase
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.mockito.Mock
@ -34,8 +33,7 @@ import org.mockito.Mockito.`when`
class LoopPluginTest : TestBase() {
@Mock lateinit var sp: SP
private val rxBus: RxBus = RxBus(aapsSchedulers, aapsLogger)
@Mock lateinit var constraintChecker: Constraints
@Mock lateinit var constraintChecker: ConstraintsChecker
@Mock lateinit var rh: ResourceHelper
@Mock lateinit var profileFunction: ProfileFunction
@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)
val pumpDescription = PumpDescription()
`when`(virtualPumpPlugin.pumpDescription).thenReturn(pumpDescription)
Assertions.assertEquals(LoopFragment::class.java.name, loopPlugin.pluginDescription.fragmentClass)
Assertions.assertEquals(PluginType.LOOP, loopPlugin.getType())
Assertions.assertEquals("Loop", loopPlugin.name)
Assertions.assertEquals("LOOP", loopPlugin.nameShort)
Assertions.assertEquals(true, loopPlugin.hasFragment())
Assertions.assertEquals(true, loopPlugin.showInList(PluginType.LOOP))
Assertions.assertEquals(info.nightscout.plugins.aps.R.xml.pref_loop.toLong(), loopPlugin.preferencesId.toLong())
assertThat(loopPlugin.pluginDescription.fragmentClass).isEqualTo(LoopFragment::class.java.name)
assertThat(loopPlugin.getType()).isEqualTo(PluginType.LOOP)
assertThat(loopPlugin.name).isEqualTo("Loop")
assertThat(loopPlugin.nameShort).isEqualTo("LOOP")
assertThat(loopPlugin.hasFragment()).isTrue()
assertThat(loopPlugin.showInList(PluginType.LOOP)).isTrue()
assertThat(loopPlugin.preferencesId.toLong()).isEqualTo(info.nightscout.plugins.aps.R.xml.pref_loop.toLong())
// Plugin is disabled by default
Assertions.assertEquals(false, loopPlugin.isEnabled())
assertThat(loopPlugin.isEnabled()).isFalse()
loopPlugin.setPluginEnabled(PluginType.LOOP, true)
Assertions.assertEquals(true, loopPlugin.isEnabled())
assertThat(loopPlugin.isEnabled()).isTrue()
// No temp basal capable pump should disable plugin
virtualPumpPlugin.pumpDescription.isTempBasalCapable = false
Assertions.assertEquals(false, loopPlugin.isEnabled())
assertThat(loopPlugin.isEnabled()).isFalse()
virtualPumpPlugin.pumpDescription.isTempBasalCapable = true
// Fragment is hidden by default
Assertions.assertEquals(false, loopPlugin.isFragmentVisible())
assertThat(loopPlugin.isFragmentVisible()).isFalse()
loopPlugin.setFragmentVisible(PluginType.LOOP, true)
Assertions.assertEquals(true, loopPlugin.isFragmentVisible())
assertThat(loopPlugin.isFragmentVisible()).isTrue()
}
/* *********** not working
@ -118,7 +116,7 @@ class LoopPluginTest : TestBase() {
MockedLoopPlugin mockedLoopPlugin = new MockedLoopPlugin();
Treatment t = new Treatment();
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.pump.PumpSync
import info.nightscout.interfaces.ui.UiInteraction
import info.nightscout.rx.bus.RxBus
import info.nightscout.shared.interfaces.ResourceHelper
import info.nightscout.shared.sharedPreferences.SP
import info.nightscout.sharedtests.TestBase
@ -37,6 +36,6 @@ class ConfigBuilderPluginTest : TestBase() {
@BeforeEach
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.bgQualityCheck.BgQualityCheck
import info.nightscout.interfaces.constraints.Constraint
import info.nightscout.interfaces.constraints.Constraints
import info.nightscout.interfaces.constraints.Objectives
import info.nightscout.interfaces.constraints.PluginConstraints
import info.nightscout.interfaces.maintenance.PrefFileListProvider
import info.nightscout.interfaces.plugin.PluginBase
import info.nightscout.interfaces.plugin.PluginType
@ -74,7 +74,7 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
private lateinit var danaPump: DanaPump
private lateinit var insightDbHelper: InsightDbHelper
private lateinit var constraintChecker: ConstraintsImpl
private lateinit var constraintChecker: ConstraintsCheckerImpl
private lateinit var safetyPlugin: SafetyPlugin
private lateinit var objectivesPlugin: ObjectivesPlugin
private lateinit var comboPlugin: ComboPlugin
@ -134,7 +134,7 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
`when`(sp.getString(R.string.key_danar_bt_name, "")).thenReturn("")
//SafetyPlugin
constraintChecker = ConstraintsImpl(activePlugin)
constraintChecker = ConstraintsCheckerImpl(activePlugin, aapsLogger)
val glucoseStatusProvider = GlucoseStatusProviderImpl(aapsLogger, iobCobCalculator, dateUtil, decimalFormatter)
@ -226,7 +226,7 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
constraintsPluginsList.add(insightPlugin)
constraintsPluginsList.add(openAPSAMAPlugin)
constraintsPluginsList.add(openAPSSMBPlugin)
`when`(activePlugin.getSpecificPluginsListByInterface(Constraints::class.java)).thenReturn(constraintsPluginsList)
`when`(activePlugin.getSpecificPluginsListByInterface(PluginConstraints::class.java)).thenReturn(constraintsPluginsList)
objectivesPlugin.onStart()
}
@ -268,7 +268,7 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
val c = constraintChecker.isAutosensModeEnabled()
assertThat(c.reasonList).hasSize(2) // Safety & Objectives
assertThat(c.mostLimitedReasonList).hasSize(2) // Safety & Objectives
assertThat( c.value()).isFalse()
assertThat(c.value()).isFalse()
}
// Safety
@ -278,7 +278,7 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
val c = constraintChecker.isAdvancedFilteringEnabled()
assertThat(c.reasonList).hasSize(1) // Safety
assertThat(c.mostLimitedReasonList).hasSize(1) // Safety
assertThat( c.value()).isFalse()
assertThat(c.value()).isFalse()
}
// SMB should limit
@ -286,7 +286,7 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
fun isSuperBolusEnabledTest() {
openAPSSMBPlugin.setPluginEnabled(PluginType.APS, true)
val c = constraintChecker.isSuperBolusEnabled()
assertThat( c.value()).isFalse() // SMB should limit
assertThat(c.value()).isFalse() // SMB should limit
}
// Safety & Objectives
@ -296,11 +296,11 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
objectivesPlugin.objectives[Objectives.SMB_OBJECTIVE].startedOn = 0
`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`(constraintChecker.isClosedLoopAllowed()).thenReturn(Constraint(true))
// `when`(constraintChecker.isClosedLoopAllowed()).thenReturn(ConstraintObject(true))
val c = constraintChecker.isSMBModeEnabled()
assertThat(c.reasonList).hasSize(3) // 2x Safety & Objectives
assertThat(c.mostLimitedReasonList).hasSize(3) // 2x Safety & Objectives
assertThat( c.value()).isFalse()
assertThat(c.value()).isFalse()
}
// applyBasalConstraints tests
@ -326,9 +326,9 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
// Apply all limits
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.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
@ -355,7 +355,7 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
val i = constraintChecker.getMaxBasalPercentAllowed(validProfile)
assertThat(i.value()).isEqualTo(200)
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
@ -380,9 +380,9 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
// Apply all limits
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.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
@ -395,7 +395,7 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
val i = constraintChecker.getMaxCarbsAllowed()
assertThat(i.value()).isEqualTo(48)
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
@ -410,9 +410,9 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
// Apply all limits
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.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
@ -426,8 +426,8 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
// Apply all limits
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.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
import android.content.Context
import com.google.common.truth.Truth.assertThat
import dagger.android.HasAndroidInjector
import info.nightscout.configuration.maintenance.MaintenancePlugin
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.sharedPreferences.SP
import info.nightscout.sharedtests.TestBase
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.mockito.Mock
@ -40,11 +40,12 @@ class MaintenancePluginTest : TestBase() {
@Test fun logFilesTest() {
var logs = sut.getLogFiles(2)
Assertions.assertEquals(2, logs.size)
Assertions.assertEquals("AndroidAPS.log", logs[0].name)
Assertions.assertEquals("AndroidAPS.2018-01-03_01-01-00.1.zip", logs[1].name)
assertThat(logs.map { it.name }).containsExactly(
"AndroidAPS.log",
"AndroidAPS.2018-01-03_01-01-00.1.zip",
).inOrder()
logs = sut.getLogFiles(10)
Assertions.assertEquals(4, logs.size)
assertThat(logs).hasSize(4)
}
@Test
@ -53,7 +54,7 @@ class MaintenancePluginTest : TestBase() {
val name = "AndroidAPS.log.zip"
var zipFile = File("build/$name")
zipFile = sut.zipLogs(zipFile, logs)
Assertions.assertTrue(zipFile.exists())
Assertions.assertTrue(zipFile.isFile)
assertThat(zipFile.exists()).isTrue()
assertThat(zipFile.isFile).isTrue()
}
}
}

View file

@ -3,12 +3,12 @@ package info.nightscout.plugins.safety
import com.google.common.truth.Truth.assertThat
import dagger.android.AndroidInjector
import dagger.android.HasAndroidInjector
import info.nightscout.core.constraints.ConstraintObject
import info.nightscout.database.impl.AppRepository
import info.nightscout.interfaces.ApsMode
import info.nightscout.interfaces.Constants
import info.nightscout.interfaces.bgQualityCheck.BgQualityCheck
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.plugin.PluginType
import info.nightscout.interfaces.profiling.Profiler
@ -29,7 +29,7 @@ import org.mockito.Mockito.`when`
class SafetyPluginTest : TestBaseWithProfile() {
@Mock lateinit var constraintChecker: Constraints
@Mock lateinit var constraintChecker: ConstraintsChecker
@Mock lateinit var virtualPumpPlugin: VirtualPumpPlugin
@Mock lateinit var glimpPlugin: GlimpPlugin
@Mock lateinit var profiler: Profiler
@ -43,7 +43,10 @@ class SafetyPluginTest : TestBaseWithProfile() {
private lateinit var openAPSAMAPlugin: OpenAPSAMAPlugin
private lateinit var openAPSSMBPlugin: OpenAPSSMBPlugin
private val injector = HasAndroidInjector { AndroidInjector { } }
private val injector = HasAndroidInjector {
AndroidInjector {
}
}
private val pumpDescription = PumpDescription()
@BeforeEach
@ -86,9 +89,8 @@ class SafetyPluginTest : TestBaseWithProfile() {
@Test
fun pumpDescriptionShouldLimitLoopInvocation() {
pumpDescription.isTempBasalCapable = false
var c = Constraint(true)
c = safetyPlugin.isLoopInvocationAllowed(c)
assertThat(c.getReasons(aapsLogger)).isEqualTo("Safety: Pump is not temp basal capable")
val c = safetyPlugin.isLoopInvocationAllowed(ConstraintObject(true, aapsLogger))
assertThat(c.getReasons()).isEqualTo("Safety: Pump is not temp basal capable")
assertThat(c.value()).isFalse()
}
@ -96,47 +98,42 @@ class SafetyPluginTest : TestBaseWithProfile() {
fun disabledEngineeringModeShouldLimitClosedLoop() {
`when`(sp.getString(info.nightscout.core.utils.R.string.key_aps_mode, ApsMode.OPEN.name)).thenReturn(ApsMode.CLOSED.name)
`when`(config.isEngineeringModeOrRelease()).thenReturn(false)
var c = Constraint(true)
c = safetyPlugin.isClosedLoopAllowed(c)
assertThat(c.getReasons(aapsLogger)).contains("Running dev version. Closed loop is disabled.")
val c = safetyPlugin.isClosedLoopAllowed(ConstraintObject(true, aapsLogger))
assertThat(c.getReasons()).contains("Running dev version. Closed loop is disabled.")
assertThat(c.value()).isFalse()
}
@Test
fun setOpenLoopInPreferencesShouldLimitClosedLoop() {
`when`(sp.getString(info.nightscout.core.utils.R.string.key_aps_mode, ApsMode.OPEN.name)).thenReturn(ApsMode.OPEN.name)
var c = Constraint(true)
c = safetyPlugin.isClosedLoopAllowed(c)
assertThat(c.getReasons(aapsLogger)).contains("Closed loop mode disabled in preferences")
val c = safetyPlugin.isClosedLoopAllowed(ConstraintObject(true, aapsLogger))
assertThat(c.getReasons()).contains("Closed loop mode disabled in preferences")
assertThat(c.value()).isFalse()
}
@Test
fun notEnabledSMBInPreferencesDisablesSMB() {
`when`(sp.getBoolean(info.nightscout.plugins.aps.R.string.key_use_smb, false)).thenReturn(false)
`when`(constraintChecker.isClosedLoopAllowed(anyObject())).thenReturn(Constraint(true))
var c = Constraint(true)
c = openAPSSMBPlugin.isSMBModeEnabled(c)
assertThat(c.getReasons(aapsLogger)).contains("SMB disabled in preferences")
`when`(constraintChecker.isClosedLoopAllowed(anyObject())).thenReturn(ConstraintObject(true, aapsLogger))
val c = openAPSSMBPlugin.isSMBModeEnabled(ConstraintObject(true, aapsLogger))
assertThat(c.getReasons()).contains("SMB disabled in preferences")
assertThat(c.value()).isFalse()
}
@Test
fun openLoopPreventsSMB() {
`when`(sp.getBoolean(info.nightscout.plugins.aps.R.string.key_use_smb, false)).thenReturn(true)
`when`(constraintChecker.isClosedLoopAllowed(anyObject())).thenReturn(Constraint(false))
var c = Constraint(true)
c = safetyPlugin.isSMBModeEnabled(c)
assertThat(c.getReasons(aapsLogger)).contains("SMB not allowed in open loop mode")
`when`(constraintChecker.isClosedLoopAllowed()).thenReturn(ConstraintObject(false, aapsLogger))
val c = safetyPlugin.isSMBModeEnabled(ConstraintObject(true, aapsLogger))
assertThat(c.getReasons()).contains("SMB not allowed in open loop mode")
assertThat(c.value()).isFalse()
}
@Test
fun bgSourceShouldPreventSMBAlways() {
`when`(activePlugin.activeBgSource).thenReturn(glimpPlugin)
var c = Constraint(true)
c = safetyPlugin.isAdvancedFilteringEnabled(c)
assertThat(c.getReasons(aapsLogger)).isEqualTo("Safety: SMB always and after carbs disabled because active BG source doesn\\'t support advanced filtering")
val c = safetyPlugin.isAdvancedFilteringEnabled(ConstraintObject(true, aapsLogger))
assertThat(c.getReasons()).isEqualTo("Safety: SMB always and after carbs disabled because active BG source doesn\\'t support advanced filtering")
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_max_daily_safety_multiplier, 3.0)).thenReturn(3.0)
`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)
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
""".trimIndent())
assertThat(c.getMostLimitedReasons(aapsLogger)).isEqualTo("Safety: Limiting max basal rate to 2.00 U/h because of hard limit")
""".trimIndent()
)
assertThat(c.getMostLimitedReasons()).isEqualTo("Safety: Limiting max basal rate to 2.00 U/h because of hard limit")
}
@Test
fun doNotAllowNegativeBasalRate() {
`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)
assertThat(d.value()).isWithin(0.01).of(0.0)
assertThat(d.getReasons(aapsLogger)).isEqualTo(
"Safety: Limiting max basal rate to 0.00 U/h because of it must be positive value")
assertThat(d.getReasons()).isEqualTo(
"Safety: Limiting max basal rate to 0.00 U/h because of it must be positive value"
)
}
@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_max_daily_safety_multiplier, 3.0)).thenReturn(3.0)
`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)
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 percent rate to 200% because of pump limit
Safety: Limiting max basal rate to 500.00 U/h because of pump limit
""".trimIndent()
)
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"
)
}
@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.getString(info.nightscout.core.utils.R.string.key_age, "")).thenReturn("child")
openAPSSMBPlugin.setPluginEnabled(PluginType.APS, true)
val i = Constraint(Constants.REALLYHIGHBASALRATE)
val i = ConstraintObject(Double.MAX_VALUE, aapsLogger)
openAPSSMBPlugin.applyBasalConstraints(i, validProfile)
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 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
""".trimIndent())
assertThat(i.getMostLimitedReasons(aapsLogger)).isEqualTo("OpenAPSSMB: Limiting max basal rate to 1.00 U/h because of max value in preferences")
""".trimIndent()
)
assertThat(i.getMostLimitedReasons()).isEqualTo("OpenAPSSMB: Limiting max basal rate to 1.00 U/h because of max value in preferences")
}
@Test
fun doNotAllowNegativePercentBasalRate() {
`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)
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: 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
""".trimIndent())
assertThat(i.getMostLimitedReasons(aapsLogger)).isEqualTo("Safety: Limiting max percent rate to 0% because of pump limit")
""".trimIndent()
)
assertThat(i.getMostLimitedReasons()).isEqualTo("Safety: Limiting max percent rate to 0% because of pump limit")
}
@Test
fun bolusAmountShouldBeLimited() {
`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")
var d = Constraint(Constants.REALLYHIGHBOLUS)
d = safetyPlugin.applyBolusConstraints(d)
val d = safetyPlugin.applyBolusConstraints(ConstraintObject(Double.MAX_VALUE, aapsLogger))
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 5.0 U because of hard limit
""".trimIndent())
assertThat(d.getMostLimitedReasons(aapsLogger)).isEqualTo("Safety: Limiting bolus to 3.0 U because of max value in preferences")
""".trimIndent()
)
assertThat(d.getMostLimitedReasons()).isEqualTo("Safety: Limiting bolus to 3.0 U because of max value in preferences")
}
@Test
fun doNotAllowNegativeBolusAmount() {
`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")
var d = Constraint(-22.0)
d = safetyPlugin.applyBolusConstraints(d)
val d = safetyPlugin.applyBolusConstraints(ConstraintObject(-22.0, aapsLogger))
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.getMostLimitedReasons(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()).isEqualTo("Safety: Limiting bolus to 0.0 U because of it must be positive value")
}
@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)
// Negative carbs not allowed
var i = Constraint(-22)
var i: Constraint<Int> = ConstraintObject(-22, aapsLogger)
safetyPlugin.applyCarbsConstraints(i)
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
i = safetyPlugin.applyCarbsConstraints(Constraint(Constants.REALLYHIGHCARBS))
i = safetyPlugin.applyCarbsConstraints(ConstraintObject(Int.MAX_VALUE, aapsLogger))
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
@ -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")
// Apply all limits
var d = Constraint(Constants.REALLYHIGHIOB)
var d: Constraint<Double> = ConstraintObject(Double.MAX_VALUE, aapsLogger)
d = safetyPlugin.applyMaxIOBConstraints(d)
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.getMostLimitedReasons(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()).isEqualTo("Safety: Limiting IOB to 0.0 U because of Low Glucose Suspend")
// Apply all limits
d = Constraint(Constants.REALLYHIGHIOB)
d = ConstraintObject(Double.MAX_VALUE, aapsLogger)
val a = openAPSAMAPlugin.applyMaxIOBConstraints(d)
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.getMostLimitedReasons(aapsLogger)).isEqualTo("OpenAPSAMA: Limiting IOB to 1.5 U because of max value in preferences")
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()).isEqualTo("OpenAPSAMA: Limiting IOB to 1.5 U because of max value in preferences")
// Apply all limits
d = Constraint(Constants.REALLYHIGHIOB)
d = ConstraintObject(Double.MAX_VALUE, aapsLogger)
val s = openAPSSMBPlugin.applyMaxIOBConstraints(d)
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.getMostLimitedReasons(aapsLogger)).isEqualTo("OpenAPSSMB: Limiting IOB to 3.0 U because of max value in preferences")
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()).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
import com.google.common.truth.Truth.assertThat
import dagger.android.AndroidInjector
import dagger.android.HasAndroidInjector
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.sharedtests.TestBase
import org.json.JSONObject
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.Test
import org.mockito.Mock
@ -45,12 +45,12 @@ class AbstractSensitivityPluginTest : TestBase() {
fun fillResultTest() {
val sut = SensitivityTestClass(pluginDescription, aapsLogger, rh, sp)
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)
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)
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)
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
import com.google.common.truth.Truth.assertThat
import dagger.android.AndroidInjector
import dagger.android.HasAndroidInjector
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.sharedtests.TestBaseWithProfile
import org.json.JSONObject
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.mockito.Mockito.`when`
@ -42,132 +42,132 @@ class PumpEnactResultTest : TestBaseWithProfile() {
val per = PumpEnactResult(injector)
per.success(true)
Assertions.assertEquals(true, per.success)
assertThat(per.success).isTrue()
}
@Test fun enactedTest() {
val per = PumpEnactResult(injector)
per.enacted(true)
Assertions.assertEquals(true, per.enacted)
assertThat(per.enacted).isTrue()
}
@Test fun commentTest() {
val per = PumpEnactResult(injector)
per.comment("SomeComment")
Assertions.assertEquals("SomeComment", per.comment)
assertThat(per.comment).isEqualTo("SomeComment")
}
@Test fun durationTest() {
val per = PumpEnactResult(injector)
per.duration(10)
Assertions.assertEquals(10, per.duration.toLong())
assertThat(per.duration.toLong()).isEqualTo(10L)
}
@Test fun absoluteTest() {
val per = PumpEnactResult(injector)
per.absolute(11.0)
Assertions.assertEquals(11.0, per.absolute, 0.01)
assertThat(per.absolute).isWithin(0.01).of(11.0)
}
@Test fun percentTest() {
val per = PumpEnactResult(injector)
per.percent(10)
Assertions.assertEquals(10, per.percent)
assertThat(per.percent).isEqualTo(10)
}
@Test fun isPercentTest() {
val per = PumpEnactResult(injector)
per.isPercent(true)
Assertions.assertEquals(true, per.isPercent)
assertThat(per.isPercent).isTrue()
}
@Test fun isTempCancelTest() {
val per = PumpEnactResult(injector)
per.isTempCancel(true)
Assertions.assertEquals(true, per.isTempCancel)
assertThat(per.isTempCancel).isTrue()
}
@Test fun bolusDeliveredTest() {
val per = PumpEnactResult(injector)
per.bolusDelivered(11.0)
Assertions.assertEquals(11.0, per.bolusDelivered, 0.01)
assertThat(per.bolusDelivered).isWithin(0.01).of(11.0)
}
@Test fun queuedTest() {
val per = PumpEnactResult(injector)
per.queued(true)
Assertions.assertEquals(true, per.queued)
assertThat(per.queued).isTrue()
}
@Test fun toStringTest() {
var per = PumpEnactResult(injector).enacted(true).bolusDelivered(10.0).comment("AAA")
Assertions.assertEquals(
assertThat(per.toText(rh)).isEqualTo(
"""
Success: false
Enacted: true
Comment: AAA
Insulin: 10.0 U
""".trimIndent(), per.toText(rh)
""".trimIndent()
)
per = PumpEnactResult(injector).enacted(true).isTempCancel(true).comment("AAA")
Assertions.assertEquals(
assertThat(per.toText(rh)).isEqualTo(
"""
Success: false
Enacted: true
Comment: AAA
Cancel temp basal
""".trimIndent(), per.toText(rh)
""".trimIndent()
)
per = PumpEnactResult(injector).enacted(true).isPercent(true).percent(90).duration(20).comment("AAA")
Assertions.assertEquals(
assertThat(per.toText(rh)).isEqualTo(
"""
Success: false
Enacted: true
Comment: AAA
Duration: 20 min
Percent: 90%
""".trimIndent(), per.toText(rh)
""".trimIndent()
)
per = PumpEnactResult(injector).enacted(true).isPercent(false).absolute(1.0).duration(30).comment("AAA")
Assertions.assertEquals(
assertThat(per.toText(rh)).isEqualTo(
"""
Success: false
Enacted: true
Comment: AAA
Duration: 30 min
Absolute: 1.0 U/h
""".trimIndent(), per.toText(rh)
""".trimIndent()
)
per = PumpEnactResult(injector).enacted(false).comment("AAA")
Assertions.assertEquals(
assertThat(per.toText(rh)).isEqualTo(
"""
Success: false
Comment: AAA
""".trimIndent(), per.toText(rh)
""".trimIndent()
)
}
@Test fun toHtmlTest() {
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")
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")
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")
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")
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() {
@ -175,15 +175,15 @@ class PumpEnactResultTest : TestBaseWithProfile() {
var per: PumpEnactResult = PumpEnactResult(injector).enacted(true).bolusDelivered(10.0).comment("AAA")
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")
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")
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")
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 {
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'
// NOTE: Do not place your application dependencies here; they belong
@ -79,7 +79,7 @@ buildscript {
plugins {
// Test Gradle build, keep disabled under normal circumstances
// 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
//id 'org.barfuin.gradle.jacocolog' version '3.1.0'
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_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.interfaces'
defaultConfig {
minSdkVersion 25 // for wear
}
}
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(':core:ns-sdk')
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-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
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
enum class ApsMode() {
enum class ApsMode {
OPEN,
CLOSED,
LGS,

View file

@ -5,16 +5,9 @@ package info.nightscout.interfaces
*/
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 MGDL_TO_MMOLL = 1 / MMOLL_TO_MGDL
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
// SMS COMMUNICATOR

View file

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

View file

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

View file

@ -1,115 +1,18 @@
package info.nightscout.interfaces.constraints
import info.nightscout.rx.logging.AAPSLogger
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()
}
interface Constraint<T : Comparable<T>> {
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>
get() = reasons
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()
}
fun getMostLimitedReasons(): String
val mostLimitedReasonList: List<String>
get() = mostLimiting
fun copyReasons(another: Constraint<*>) {
reasons.addAll(another.reasonList)
}
init {
originalValue = value
}
fun copyReasons(another: Constraint<*>)
}

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
/** 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