Merge pull request #2801 from nightscout/refactor

[WIP] Refactor
This commit is contained in:
Milos Kozak 2023-09-20 14:32:24 +02:00 committed by GitHub
commit 9507464ce8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
425 changed files with 2851 additions and 4376 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

@ -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,95 +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="pref_show_week_number">Zobrazit číslo týdne</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_week_number">Číslo týdne (ww)</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,95 +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="pref_show_week_number">Vis ugenummer</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_week_number">Ugenummer (uu)</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,95 +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="pref_show_week_number">Εμφάνιση αριθμού Εβδομάδας</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_week_number">Αριθμός Εβδομάδας (ww)</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,95 +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 bucle</string>
<string name="pref_show_basal_rate">Mostrar la tasa basal</string>
<string name="pref_show_loop_status">Mostrar estado del bucle</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="pref_show_week_number">Mostrar número de semana</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 bucle(%)</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_week_number">Número de semana (ww)</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,95 +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="pref_show_week_number">Afficher numéro semaine</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_week_number">Numéro de semaine (ww)</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,95 +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="pref_show_week_number">Rodyti savaitės numerį</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_week_number">Savaitės numeris</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,95 +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="pref_show_week_number">Weeknummer weergeven</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_week_number">Weeknummer (ww)</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,95 +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="pref_show_week_number">Vis ukenummer</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_week_number">Ukenummer (ww)</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,95 +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="pref_show_week_number">Pokaż numer tygodnia</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_week_number">Numer tygodnia (ww)</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,84 +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="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_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">Отображать заряд батареи системы</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="default_custom_watchface_comment">Циферблат по умолчанию, вы можете нажать на EXPORT WATCHFACE чтобы создать шаблон</string>
<string name="wear_default_watchface">Циферблат по умолчанию</string>
<string name="cwf_comment_background">Фоновое изображение</string>
<string name="cwf_comment_chart">Графики (ГК, базал, линии прогнозов...)</string>
<string name="cwf_comment_iob1">Метка IOB, или общего IOB для подробного отображения</string>
<string name="cwf_comment_iob2">Общий IOB, или (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">Заряд системы ИПЖ (%)</string>
<string name="cwf_comment_basalRate">Базальная скорость</string>
<string name="cwf_comment_bgi">Значение ГКИ</string>
<string name="cwf_comment_time">Время (ЧЧ:ММ или ЧЧ:ММ:СС)</string>
<string name="cwf_comment_hour">Часы (ЧЧ)</string>
<string name="cwf_comment_minute">Минуты (ММ)</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_direction">Стрелка тренда</string>
<string name="cwf_comment_timestamp">Минут с последнего чтения ГК</string>
<string name="cwf_comment_sgv">Значение ГК</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,95 +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="pref_show_week_number">Zobraziť číslo týždňa</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_week_number">Číslo týždňa (ww)</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,95 +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="pref_show_week_number">Hafta sayısını 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_week_number">Hafta sayısı</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

@ -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')

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

@ -9,8 +9,7 @@ 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.sdk.interfaces.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
@ -21,7 +20,7 @@ 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
@ -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

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

@ -9,13 +9,14 @@ import info.nightscout.androidaps.insight.database.InsightDatabase
import info.nightscout.androidaps.insight.database.InsightDatabaseDao
import info.nightscout.androidaps.insight.database.InsightDbHelper
import info.nightscout.androidaps.plugins.pump.insight.LocalInsightPlugin
import info.nightscout.core.constraints.ConstraintObject
import info.nightscout.database.impl.AppRepository
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 +75,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
@ -94,6 +95,9 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
if (it is PumpEnactResult) {
it.context = context
}
if (it is ConstraintObject<*>) {
it.aapsLogger = aapsLogger
}
}
}
@ -134,7 +138,7 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
`when`(sp.getString(R.string.key_danar_bt_name, "")).thenReturn("")
//SafetyPlugin
constraintChecker = ConstraintsImpl(activePlugin)
constraintChecker = ConstraintsCheckerImpl(activePlugin, injector)
val glucoseStatusProvider = GlucoseStatusProviderImpl(aapsLogger, iobCobCalculator, dateUtil, decimalFormatter)
@ -226,7 +230,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 +272,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 +282,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 +290,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 +300,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 +330,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 +359,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 +384,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 +399,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 +414,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 +430,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

@ -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,13 @@ class SafetyPluginTest : TestBaseWithProfile() {
private lateinit var openAPSAMAPlugin: OpenAPSAMAPlugin
private lateinit var openAPSSMBPlugin: OpenAPSSMBPlugin
private val injector = HasAndroidInjector { AndroidInjector { } }
private val injector = HasAndroidInjector {
AndroidInjector {
if (it is ConstraintObject<*>) {
it.aapsLogger = aapsLogger
}
}
}
private val pumpDescription = PumpDescription()
@BeforeEach
@ -86,9 +92,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, injector))
assertThat(c.getReasons()).isEqualTo("Safety: Pump is not temp basal capable")
assertThat(c.value()).isFalse()
}
@ -96,47 +101,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, injector))
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, injector))
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, injector))
val c = openAPSSMBPlugin.isSMBModeEnabled(ConstraintObject(true, injector))
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, injector))
val c = safetyPlugin.isSMBModeEnabled(ConstraintObject(true, injector))
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, injector))
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 +146,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, injector)
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, injector)
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 +175,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, injector)
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 +199,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, injector)
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, injector)
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, injector))
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, injector))
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 +259,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, injector)
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, injector))
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 +282,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, injector)
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, injector)
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, injector)
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

@ -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

@ -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,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.plugins.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

@ -1,6 +1,6 @@
package info.nightscout.interfaces.notifications
class NotificationUserMessage (text :String): Notification() {
class NotificationUserMessage(text: String) : Notification() {
init {
var hash = text.hashCode()

View file

@ -1,8 +1,8 @@
package info.nightscout.interfaces.plugin
import info.nightscout.interfaces.annotations.InterfacesOpenForTesting
import info.nightscout.annotations.OpenForTesting
@InterfacesOpenForTesting
@OpenForTesting
class PluginDescription {
var mainType = PluginType.GENERAL

View file

@ -5,4 +5,5 @@ interface SmsCommunicator {
var messages: ArrayList<Sms>
fun sendNotificationToAllNumbers(text: String): Boolean
fun sendSMS(sms: Sms): Boolean
fun isEnabled(): Boolean
}

View file

@ -4,6 +4,7 @@ import info.nightscout.database.entities.TemporaryTarget
import info.nightscout.database.entities.TherapyEvent
import info.nightscout.database.entities.ValueWithUnit
import info.nightscout.interfaces.Constants
import info.nightscout.interfaces.GlucoseUnit
sealed class ValueWithUnitMapper { //I use a sealed class because of StringResource that contains a listOf as second parameter
@ -79,12 +80,9 @@ sealed class ValueWithUnitMapper { //I use a sealed class because of St
companion object {
const val MGDL = Constants.MGDL
const val MMOL = Constants.MMOL
fun fromGlucoseUnit(value: Double, string: String): ValueWithUnitMapper? = when (string) {
MGDL, "mgdl" -> Mgdl(value)
MMOL, "mmol/l" -> Mmoll(value)
GlucoseUnit.MGDL.asText, "mgdl" -> Mgdl(value)
GlucoseUnit.MMOL.asText, "mmol/l" -> Mmoll(value)
else -> null
}
}

View file

@ -0,0 +1,15 @@
package info.nightscout.rx
import io.reactivex.rxjava3.core.Scheduler
/**
* Created by adrian on 12.04.20.
*/
interface AapsSchedulers {
val main: Scheduler
val io: Scheduler
val cpu: Scheduler
val newThread: Scheduler
}

View file

@ -0,0 +1,13 @@
package info.nightscout.rx.bus
import info.nightscout.rx.events.Event
import io.reactivex.rxjava3.core.Observable
interface RxBus {
fun send(event: 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>
}

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