Merge remote-tracking branch 'Nightscout/dev' into wear/new_custom_watchface
# Conflicts: # wear/src/main/java/info/nightscout/androidaps/watchfaces/CustomWatchface.kt
This commit is contained in:
commit
23cb374ab3
886 changed files with 9349 additions and 7425 deletions
|
@ -21,5 +21,5 @@ android {
|
|||
}
|
||||
|
||||
dependencies {
|
||||
implementation project(':app-wear-shared:shared')
|
||||
implementation project(':core:interfaces')
|
||||
}
|
|
@ -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()
|
||||
}
|
|
@ -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
|
||||
|
||||
/**
|
|
@ -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()
|
||||
}
|
|
@ -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)
|
|
@ -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)
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 41 KiB |
|
@ -1,8 +1,8 @@
|
|||
package info.nightscout.shared.impl.logging
|
||||
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import info.nightscout.rx.logging.LTag
|
||||
import info.nightscout.shared.sharedPreferences.SP
|
||||
import org.junit.jupiter.api.Assertions
|
||||
import org.junit.jupiter.api.BeforeEach
|
||||
import org.junit.jupiter.api.Test
|
||||
import org.junit.jupiter.api.extension.ExtendWith
|
||||
|
@ -26,13 +26,13 @@ class LImplTest {
|
|||
|
||||
@Test
|
||||
fun findByName() {
|
||||
Assertions.assertEquals(LTag.APS.name, sut.findByName("APS").name)
|
||||
Assertions.assertEquals("NONEXISTENT", sut.findByName("APS2").name)
|
||||
assertThat(sut.findByName("APS").name).isEqualTo(LTag.APS.name)
|
||||
assertThat(sut.findByName("APS2").name).isEqualTo("NONEXISTENT")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun getLogElements() {
|
||||
Assertions.assertTrue(sut.getLogElements().isNotEmpty())
|
||||
assertThat(sut.getLogElements()).isNotEmpty()
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -40,6 +40,6 @@ class LImplTest {
|
|||
val element = sut.findByName("APS")
|
||||
element.enabled = false
|
||||
sut.resetToDefaults()
|
||||
Assertions.assertTrue(element.enabled)
|
||||
assertThat(element.enabled).isTrue()
|
||||
}
|
||||
}
|
|
@ -1,8 +1,8 @@
|
|||
package info.nightscout.shared.impl.sharedPreferences
|
||||
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import android.content.Context
|
||||
import info.nightscout.shared.impl.SharedPreferencesMock
|
||||
import org.junit.jupiter.api.Assertions
|
||||
import org.junit.jupiter.api.BeforeEach
|
||||
import org.junit.jupiter.api.Test
|
||||
import org.junit.jupiter.api.extension.ExtendWith
|
||||
|
@ -34,153 +34,153 @@ class SPImplementationTest {
|
|||
@Test
|
||||
fun edit() {
|
||||
sut.edit { putBoolean("test", true) }
|
||||
Assertions.assertTrue(sut.getBoolean("test", false))
|
||||
assertThat(sut.getBoolean("test", false)).isTrue()
|
||||
sut.edit { remove("test") }
|
||||
Assertions.assertFalse(sut.contains("test"))
|
||||
assertThat(sut.contains("test")).isFalse()
|
||||
sut.edit { putBoolean(someResource, true) }
|
||||
Assertions.assertTrue(sut.getBoolean(someResource, false))
|
||||
assertThat(sut.getBoolean(someResource, false)).isTrue()
|
||||
sut.edit { remove(someResource) }
|
||||
Assertions.assertFalse(sut.contains(someResource))
|
||||
assertThat(sut.contains(someResource)).isFalse()
|
||||
|
||||
sut.edit(commit = true) { putDouble("test", 1.0) }
|
||||
Assertions.assertEquals(1.0, sut.getDouble("test", 2.0))
|
||||
assertThat(sut.getDouble("test", 2.0)).isEqualTo(1.0)
|
||||
sut.edit { putDouble(someResource, 1.0) }
|
||||
Assertions.assertEquals(1.0, sut.getDouble(someResource, 2.0))
|
||||
assertThat(sut.getDouble(someResource, 2.0)).isEqualTo(1.0)
|
||||
sut.edit { clear() }
|
||||
Assertions.assertFalse(sut.contains(someResource2))
|
||||
assertThat(sut.contains(someResource2)).isFalse()
|
||||
|
||||
sut.edit { putInt("test", 1) }
|
||||
Assertions.assertEquals(1, sut.getInt("test", 2))
|
||||
assertThat(sut.getInt("test", 2)).isEqualTo(1)
|
||||
sut.edit { putInt(someResource, 1) }
|
||||
Assertions.assertEquals(1, sut.getInt(someResource, 2))
|
||||
assertThat(sut.getInt(someResource, 2)).isEqualTo(1)
|
||||
sut.edit { clear() }
|
||||
|
||||
sut.edit { putLong("test", 1L) }
|
||||
Assertions.assertEquals(1L, sut.getLong("test", 2L))
|
||||
assertThat(sut.getLong("test", 2L)).isEqualTo(1L)
|
||||
sut.edit { putLong(someResource, 1) }
|
||||
Assertions.assertEquals(1L, sut.getLong(someResource, 2L))
|
||||
assertThat(sut.getLong(someResource, 2L)).isEqualTo(1L)
|
||||
sut.edit { clear() }
|
||||
|
||||
sut.edit { putString("test", "string") }
|
||||
Assertions.assertEquals("string", sut.getString("test", "a"))
|
||||
assertThat(sut.getString("test", "a")).isEqualTo("string")
|
||||
sut.edit { putString(someResource, "string") }
|
||||
Assertions.assertEquals("string", sut.getString(someResource, "a"))
|
||||
assertThat(sut.getString(someResource, "a")).isEqualTo("string")
|
||||
sut.edit { clear() }
|
||||
}
|
||||
|
||||
@Test
|
||||
fun clear() {
|
||||
sut.putBoolean("test", true)
|
||||
Assertions.assertTrue(sut.getAll().containsKey("test"))
|
||||
assertThat(sut.getAll()).containsKey("test")
|
||||
sut.clear()
|
||||
Assertions.assertFalse(sut.getAll().containsKey("test"))
|
||||
assertThat(sut.getAll()).doesNotContainKey("test")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun contains() {
|
||||
sut.putBoolean("test", true)
|
||||
Assertions.assertTrue(sut.contains("test"))
|
||||
assertThat(sut.contains("test")).isTrue()
|
||||
sut.putBoolean(someResource, true)
|
||||
Assertions.assertTrue(sut.contains(someResource))
|
||||
assertThat(sut.contains(someResource)).isTrue()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun remove() {
|
||||
sut.putBoolean("test", true)
|
||||
sut.remove("test")
|
||||
Assertions.assertFalse(sut.contains("test"))
|
||||
assertThat(sut.contains("test")).isFalse()
|
||||
sut.putBoolean(someResource, true)
|
||||
sut.remove(someResource)
|
||||
Assertions.assertFalse(sut.contains(someResource))
|
||||
assertThat(sut.contains(someResource)).isFalse()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun getString() {
|
||||
sut.putString("test", "string")
|
||||
Assertions.assertTrue(sut.getString("test", "") == "string")
|
||||
Assertions.assertTrue(sut.getString("test1", "") == "")
|
||||
assertThat(sut.getString("test", "")).isEqualTo("string")
|
||||
assertThat(sut.getString("test1", "")).isEmpty()
|
||||
sut.putString(someResource, "string")
|
||||
Assertions.assertTrue(sut.getString(someResource, "") == "string")
|
||||
Assertions.assertTrue(sut.getString(someResource2, "") == "")
|
||||
assertThat(sut.getString(someResource, "")).isEqualTo("string")
|
||||
assertThat(sut.getString(someResource2, "")).isEmpty()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun getStringOrNull() {
|
||||
sut.putString("test", "string")
|
||||
Assertions.assertTrue(sut.getStringOrNull("test", "") == "string")
|
||||
Assertions.assertNull(sut.getStringOrNull("test1", null))
|
||||
assertThat(sut.getStringOrNull("test", "")).isEqualTo("string")
|
||||
assertThat(sut.getStringOrNull("test1", null)).isNull()
|
||||
sut.putString(someResource, "string")
|
||||
Assertions.assertTrue(sut.getStringOrNull(someResource, null) == "string")
|
||||
Assertions.assertNull(sut.getStringOrNull(someResource2, null))
|
||||
assertThat(sut.getStringOrNull(someResource, null)).isEqualTo("string")
|
||||
assertThat(sut.getStringOrNull(someResource2, null)).isNull()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun getBoolean() {
|
||||
sut.putBoolean("test", true)
|
||||
Assertions.assertTrue(sut.getBoolean("test", false))
|
||||
assertThat(sut.getBoolean("test", false)).isTrue()
|
||||
sut.putBoolean(someResource, true)
|
||||
Assertions.assertTrue(sut.getBoolean(someResource, false))
|
||||
assertThat(sut.getBoolean(someResource, false)).isTrue()
|
||||
sut.putString("string_key", "a")
|
||||
Assertions.assertTrue(sut.getBoolean("string_key", true))
|
||||
assertThat(sut.getBoolean("string_key", true)).isTrue()
|
||||
sut.putString(someResource, "a")
|
||||
Assertions.assertTrue(sut.getBoolean(someResource, true))
|
||||
assertThat(sut.getBoolean(someResource, true)).isTrue()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun getDouble() {
|
||||
sut.putDouble("test", 1.0)
|
||||
Assertions.assertEquals(1.0, sut.getDouble("test", 2.0))
|
||||
Assertions.assertEquals(2.0, sut.getDouble("test1", 2.0))
|
||||
assertThat(sut.getDouble("test", 2.0)).isEqualTo(1.0)
|
||||
assertThat(sut.getDouble("test1", 2.0)).isEqualTo(2.0)
|
||||
sut.putDouble(someResource, 1.0)
|
||||
Assertions.assertEquals(1.0, sut.getDouble(someResource, 2.0))
|
||||
Assertions.assertEquals(2.0, sut.getDouble(someResource2, 2.0))
|
||||
assertThat(sut.getDouble(someResource, 2.0)).isEqualTo(1.0)
|
||||
assertThat(sut.getDouble(someResource2, 2.0)).isEqualTo(2.0)
|
||||
sut.putString("string_key", "a")
|
||||
Assertions.assertEquals(1.0, sut.getDouble("string_key", 1.0))
|
||||
assertThat(sut.getDouble("string_key", 1.0)).isEqualTo(1.0)
|
||||
sut.putString(someResource, "a")
|
||||
Assertions.assertEquals(1.0, sut.getDouble(someResource, 1.0))
|
||||
assertThat(sut.getDouble(someResource, 1.0)).isEqualTo(1.0)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun getInt() {
|
||||
sut.putInt("test", 1)
|
||||
Assertions.assertEquals(1, sut.getInt("test", 2))
|
||||
Assertions.assertEquals(2, sut.getInt("test1", 2))
|
||||
assertThat(sut.getInt("test", 2)).isEqualTo(1)
|
||||
assertThat(sut.getInt("test1", 2)).isEqualTo(2)
|
||||
sut.putInt(someResource, 1)
|
||||
Assertions.assertEquals(1, sut.getInt(someResource, 2))
|
||||
Assertions.assertEquals(2, sut.getInt(someResource2, 2))
|
||||
assertThat(sut.getInt(someResource, 2)).isEqualTo(1)
|
||||
assertThat(sut.getInt(someResource2, 2)).isEqualTo(2)
|
||||
sut.putString("string_key", "a")
|
||||
Assertions.assertEquals(1, sut.getInt("string_key", 1))
|
||||
assertThat(sut.getInt("string_key", 1)).isEqualTo(1)
|
||||
sut.putString(someResource, "a")
|
||||
Assertions.assertEquals(1, sut.getInt(someResource, 1))
|
||||
assertThat(sut.getInt(someResource, 1)).isEqualTo(1)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun getLong() {
|
||||
sut.putLong("test", 1L)
|
||||
Assertions.assertEquals(1L, sut.getLong("test", 2L))
|
||||
Assertions.assertEquals(2L, sut.getLong("test1", 2L))
|
||||
assertThat(sut.getLong("test", 2L)).isEqualTo(1L)
|
||||
assertThat(sut.getLong("test1", 2L)).isEqualTo(2L)
|
||||
sut.putLong(someResource, 1L)
|
||||
Assertions.assertEquals(1L, sut.getLong(someResource, 2L))
|
||||
Assertions.assertEquals(2L, sut.getLong(someResource2, 2L))
|
||||
assertThat(sut.getLong(someResource, 2L)).isEqualTo(1L)
|
||||
assertThat(sut.getLong(someResource2, 2L)).isEqualTo(2L)
|
||||
sut.putString("string_key", "a")
|
||||
Assertions.assertEquals(1L, sut.getLong("string_key", 1L))
|
||||
assertThat(sut.getLong("string_key", 1L)).isEqualTo(1L)
|
||||
sut.putString(someResource, "a")
|
||||
Assertions.assertEquals(1L, sut.getLong(someResource, 1L))
|
||||
assertThat(sut.getLong(someResource, 1L)).isEqualTo(1L)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun incLong() {
|
||||
sut.incLong(someResource)
|
||||
Assertions.assertEquals(1L, sut.getLong(someResource, 3L))
|
||||
assertThat(sut.getLong(someResource, 3L)).isEqualTo(1L)
|
||||
sut.incLong(someResource)
|
||||
Assertions.assertEquals(2L, sut.getLong(someResource, 3L))
|
||||
assertThat(sut.getLong(someResource, 3L)).isEqualTo(2L)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun incInt() {
|
||||
sut.incInt(someResource)
|
||||
Assertions.assertEquals(1, sut.getInt(someResource, 3))
|
||||
assertThat(sut.getInt(someResource, 3)).isEqualTo(1)
|
||||
sut.incInt(someResource)
|
||||
Assertions.assertEquals(2, sut.getInt(someResource, 3))
|
||||
assertThat(sut.getInt(someResource, 3)).isEqualTo(2)
|
||||
}
|
||||
}
|
|
@ -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"
|
||||
|
|
|
@ -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.
|
|
@ -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")
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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()
|
||||
}
|
1
app-wear-shared/shared/.gitignore
vendored
1
app-wear-shared/shared/.gitignore
vendored
|
@ -1 +0,0 @@
|
|||
/build
|
|
@ -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"
|
||||
}
|
21
app-wear-shared/shared/proguard-rules.pro
vendored
21
app-wear-shared/shared/proguard-rules.pro
vendored
|
@ -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
|
|
@ -1,4 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest>
|
||||
|
||||
</manifest>
|
|
@ -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()
|
||||
}
|
|
@ -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)
|
||||
}
|
|
@ -1,9 +0,0 @@
|
|||
package info.nightscout.shared.di
|
||||
|
||||
import dagger.Module
|
||||
|
||||
@Module(
|
||||
includes = [
|
||||
]
|
||||
)
|
||||
open class SharedModule
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -1,93 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- DateUtil-->
|
||||
<string name="minago">před %1$d min</string>
|
||||
<string name="minago_long">před %1$d minutamí</string>
|
||||
<string name="hoursago">před %1$.1f h</string>
|
||||
<string name="days_ago">Před %1$.1f dny</string>
|
||||
<string name="days_ago_round">Před %1$.0f dny</string>
|
||||
<string name="in_days">za %1$.0f dní</string>
|
||||
<string name="in_days_round">za %1$.0f dní</string>
|
||||
<string name="shorthour">h</string>
|
||||
<string name="days">dnů</string>
|
||||
<string name="hours">hodin</string>
|
||||
<string name="unit_second">sekund</string>
|
||||
<string name="unit_minute">minut</string>
|
||||
<string name="unit_hour">hodina</string>
|
||||
<string name="unit_day">den</string>
|
||||
<string name="unit_week">týden</string>
|
||||
<string name="unit_seconds">sekund</string>
|
||||
<string name="unit_minutes">minut</string>
|
||||
<string name="unit_hours">hodin</string>
|
||||
<string name="unit_days">dní</string>
|
||||
<string name="unit_weeks">týdnů</string>
|
||||
<string name="shortminute">m</string>
|
||||
<string name="shortday">d</string>
|
||||
<string name="later_today">Později během dneška</string>
|
||||
<string name="tomorrow">Zítra</string>
|
||||
<string name="today">Dnes</string>
|
||||
<string name="yesterday">Včera</string>
|
||||
<!-- Rx -->
|
||||
<string name="connecting_for">Připojování %1$d sec</string>
|
||||
<string name="handshaking">Navazování spojení</string>
|
||||
<string name="connected">Připojeno</string>
|
||||
<string name="disconnecting">Odpojuji</string>
|
||||
<string name="waiting_for_disconnection">Čekám na odpojení</string>
|
||||
<!-- Custom Watchface -->
|
||||
<string name="metadata_label_watchface_created_at">Vytvořeno: %1$s</string>
|
||||
<string name="metadata_label_watchface_author">Autor: %1$s</string>
|
||||
<string name="metadata_label_watchface_name">Jméno %1$s</string>
|
||||
<string name="metadata_wear_import_filename">Název souboru: %1$s</string>
|
||||
<string name="metadata_label_plugin_version">Verze pluginu: %1$s</string>
|
||||
<string name="metadata_label_watchface_name_version">Jméno: %1$s (%2$s)</string>
|
||||
<string name="metadata_label_watchface_infos">Informace: %1$s</string>
|
||||
<string name="pref_show_iob">Zobrazit IOB</string>
|
||||
<string name="pref_show_detailed_iob">Zobrazit detailní IOB</string>
|
||||
<string name="pref_show_cob">Zobrazit COB</string>
|
||||
<string name="pref_show_delta">Zobrazit deltu</string>
|
||||
<string name="pref_show_detailed_delta">Zobrazit detailní deltu</string>
|
||||
<string name="pref_show_avgdelta">Zobrazit průměrnou deltu</string>
|
||||
<string name="pref_show_phone_battery">Zobrazit stav baterie telefonu</string>
|
||||
<string name="pref_show_rig_battery">Zobrazit stav baterie dalších zařízení</string>
|
||||
<string name="pref_show_basal_rate">Zobrazit bazál</string>
|
||||
<string name="pref_show_loop_status">Zobrazit stav smyčky</string>
|
||||
<string name="pref_show_bg">Zobrazit glykémii</string>
|
||||
<string name="pref_show_bgi">Zobrazit BGI</string>
|
||||
<string name="pref_show_direction_arrow">Zobrazit trendovou šipku</string>
|
||||
<string name="pref_show_ago">Zobrazit aktualizováno před</string>
|
||||
<string name="default_custom_watchface_comment">Výchozí ciferník. Můžete kliknout na tlačítko EXPORTOVAT CIFERNÍK pro vygenerování šablony</string>
|
||||
<string name="wear_default_watchface">Výchozí ciferník</string>
|
||||
<string name="cwf_comment_background">Tapeta</string>
|
||||
<string name="cwf_comment_chart">Grafy (glykémie, bazály, křivky předpovědí...)</string>
|
||||
<string name="cwf_comment_cover_chart">Obrázek před grafem a za textovými poli</string>
|
||||
<string name="cwf_comment_freetext1">Volný text 1</string>
|
||||
<string name="cwf_comment_freetext2">Volný text 2</string>
|
||||
<string name="cwf_comment_freetext3">Volný text 3</string>
|
||||
<string name="cwf_comment_freetext4">Volný text 4</string>
|
||||
<string name="cwf_comment_iob1">Štítek IOB nebo suma IOB při zapnutých detailech</string>
|
||||
<string name="cwf_comment_iob2">Suma IOB nebo (Bolus_IOB|Basal_IOB) při zapnutých detailech</string>
|
||||
<string name="cwf_comment_cob1">Štítek COB</string>
|
||||
<string name="cwf_comment_cob2">Hodnota COB</string>
|
||||
<string name="cwf_comment_delta">Krátkodobý průměr</string>
|
||||
<string name="cwf_comment_avg_delta">Průměrný rozdíl glykémií (15min)</string>
|
||||
<string name="cwf_comment_uploader_battery">Baterie telefonu (%)</string>
|
||||
<string name="cwf_comment_rig_battery">Baterie smyčky (%)</string>
|
||||
<string name="cwf_comment_basalRate">Bazální dávka</string>
|
||||
<string name="cwf_comment_bgi">Hodnota BGI</string>
|
||||
<string name="cwf_comment_time">Čas (HH:MM nebo HH:MM:SS)</string>
|
||||
<string name="cwf_comment_hour">Hodiny (HH)</string>
|
||||
<string name="cwf_comment_minute">Minuty (MM)</string>
|
||||
<string name="cwf_comment_second">Sekundy (SS)</string>
|
||||
<string name="cwf_comment_timePeriod">AM nebo PM</string>
|
||||
<string name="cwf_comment_day_name">Jméno dne v týdnu</string>
|
||||
<string name="cwf_comment_day">Den (DD)</string>
|
||||
<string name="cwf_comment_month">Název měsíce (krátký)</string>
|
||||
<string name="cwf_comment_loop">Stav smyčky a čas</string>
|
||||
<string name="cwf_comment_direction">Trendová šipka</string>
|
||||
<string name="cwf_comment_timestamp">Před minutami pro poslední přijaté glykémie</string>
|
||||
<string name="cwf_comment_sgv">Hodnota glykémie</string>
|
||||
<string name="cwf_comment_cover_plate">Úvodní obrázek před textem (vytáčení...)</string>
|
||||
<string name="cwf_comment_hour_hand">Obrázek hodinové ručičky (Analogové hodinky)</string>
|
||||
<string name="cwf_comment_minute_hand">Obrázek minutové ručičky (Analogové hodinky)</string>
|
||||
<string name="cwf_comment_second_hand">Obrázek druhé ručičky (Analogové hodinky)</string>
|
||||
</resources>
|
|
@ -1,93 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- DateUtil-->
|
||||
<string name="minago">%1$d min. siden</string>
|
||||
<string name="minago_long">%1$d minutter siden</string>
|
||||
<string name="hoursago">%1$.1f t siden</string>
|
||||
<string name="days_ago">%1$.1f dage siden</string>
|
||||
<string name="days_ago_round">%1$.0f dage siden</string>
|
||||
<string name="in_days">om %1$.0f dage</string>
|
||||
<string name="in_days_round">om %1$.0f dage</string>
|
||||
<string name="shorthour">t</string>
|
||||
<string name="days">dage</string>
|
||||
<string name="hours">timer</string>
|
||||
<string name="unit_second">sekund</string>
|
||||
<string name="unit_minute">minut</string>
|
||||
<string name="unit_hour">time</string>
|
||||
<string name="unit_day">dag</string>
|
||||
<string name="unit_week">uge</string>
|
||||
<string name="unit_seconds">sekunder</string>
|
||||
<string name="unit_minutes">minutter</string>
|
||||
<string name="unit_hours">timer</string>
|
||||
<string name="unit_days">dage</string>
|
||||
<string name="unit_weeks">uger</string>
|
||||
<string name="shortminute">min</string>
|
||||
<string name="shortday">d</string>
|
||||
<string name="later_today">Senere i dag</string>
|
||||
<string name="tomorrow">I morgen</string>
|
||||
<string name="today">I dag</string>
|
||||
<string name="yesterday">I går</string>
|
||||
<!-- Rx -->
|
||||
<string name="connecting_for">Opretter forbindelse i %1$d s</string>
|
||||
<string name="handshaking">Forbindelse verificeres</string>
|
||||
<string name="connected">Tilsuttet</string>
|
||||
<string name="disconnecting">Afbryder</string>
|
||||
<string name="waiting_for_disconnection">Venter på afbrydelse</string>
|
||||
<!-- Custom Watchface -->
|
||||
<string name="metadata_label_watchface_created_at">Oprettet den: %1$s</string>
|
||||
<string name="metadata_label_watchface_author">Forfatter: %1$s</string>
|
||||
<string name="metadata_label_watchface_name">Navn: %1$s</string>
|
||||
<string name="metadata_wear_import_filename">Filnavn: %1$s</string>
|
||||
<string name="metadata_label_plugin_version">Plugin version: %1$s</string>
|
||||
<string name="metadata_label_watchface_name_version">Navn: %1$s (%2$s)</string>
|
||||
<string name="metadata_label_watchface_infos">Oplysning: %1$s</string>
|
||||
<string name="pref_show_iob">Vis IOB</string>
|
||||
<string name="pref_show_detailed_iob">Vis detaljeret IOB</string>
|
||||
<string name="pref_show_cob">Vis COB</string>
|
||||
<string name="pref_show_delta">Vis Delta</string>
|
||||
<string name="pref_show_detailed_delta">Vis detaljeret Delta</string>
|
||||
<string name="pref_show_avgdelta">Show GnsDelta</string>
|
||||
<string name="pref_show_phone_battery">Vis Telefonbatteri</string>
|
||||
<string name="pref_show_rig_battery">Vis Rig-batteri</string>
|
||||
<string name="pref_show_basal_rate">Vis Basalrate</string>
|
||||
<string name="pref_show_loop_status">Vis Loop-status</string>
|
||||
<string name="pref_show_bg">Vis BS</string>
|
||||
<string name="pref_show_bgi">Vis BSI</string>
|
||||
<string name="pref_show_direction_arrow">Vis Retningspil</string>
|
||||
<string name="pref_show_ago">Vis alder</string>
|
||||
<string name="default_custom_watchface_comment">Standard urskive, du kan klikke på EKSPORTÉR URSKIVE-knappen for at generere en skabelon</string>
|
||||
<string name="wear_default_watchface">Standard Urskive</string>
|
||||
<string name="cwf_comment_background">Baggrundsbillede</string>
|
||||
<string name="cwf_comment_chart">Grafer (BS, basal, prognoselinjer...)</string>
|
||||
<string name="cwf_comment_cover_chart">Billede foran graf og bag tekstfelter</string>
|
||||
<string name="cwf_comment_freetext1">Fritekst 1</string>
|
||||
<string name="cwf_comment_freetext2">Fri tekst 2</string>
|
||||
<string name="cwf_comment_freetext3">Fri tekst 3</string>
|
||||
<string name="cwf_comment_freetext4">Fri tekst 4</string>
|
||||
<string name="cwf_comment_iob1">IOB-etiket eller IOB-sum, hvis givet</string>
|
||||
<string name="cwf_comment_iob2">IOB-sum eller (Bolus_IOB|Basal_IOB) hvis givet</string>
|
||||
<string name="cwf_comment_cob1">COB-etiket</string>
|
||||
<string name="cwf_comment_cob2">COB-værdi</string>
|
||||
<string name="cwf_comment_delta">Kort BG-delta</string>
|
||||
<string name="cwf_comment_avg_delta">Gennemsnitlig BG-delta (15min)</string>
|
||||
<string name="cwf_comment_uploader_battery">Telefonbatteri (%)</string>
|
||||
<string name="cwf_comment_rig_battery">Globalt loop batteri (%)</string>
|
||||
<string name="cwf_comment_basalRate">Basalrate</string>
|
||||
<string name="cwf_comment_bgi">BGI-værdi</string>
|
||||
<string name="cwf_comment_time">Tid (TT:MM eller TT:MM:SS)</string>
|
||||
<string name="cwf_comment_hour">Time (TT)</string>
|
||||
<string name="cwf_comment_minute">Minut (MM)</string>
|
||||
<string name="cwf_comment_second">Sekund (SS)</string>
|
||||
<string name="cwf_comment_timePeriod">AM eller PM</string>
|
||||
<string name="cwf_comment_day_name">Navn på ugedag</string>
|
||||
<string name="cwf_comment_day">Dag (DD)</string>
|
||||
<string name="cwf_comment_month">Måned navn (kort)</string>
|
||||
<string name="cwf_comment_loop">Loop status og tid</string>
|
||||
<string name="cwf_comment_direction">Retningspil</string>
|
||||
<string name="cwf_comment_timestamp">Minutter siden sidst modtaget BS</string>
|
||||
<string name="cwf_comment_sgv">BS-værdi</string>
|
||||
<string name="cwf_comment_cover_plate">Dækbillede foran tekst (opkald...)</string>
|
||||
<string name="cwf_comment_hour_hand">Billede af timeviser (Analogur)</string>
|
||||
<string name="cwf_comment_minute_hand">Billede af minutviser (Analogur)</string>
|
||||
<string name="cwf_comment_second_hand">Billede af sekundviser (Analogur)</string>
|
||||
</resources>
|
|
@ -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>
|
|
@ -1,93 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- DateUtil-->
|
||||
<string name="minago">%1$d λ πριν</string>
|
||||
<string name="minago_long">%1$d λεπτά πριν</string>
|
||||
<string name="hoursago">%1$.1f ω πριν</string>
|
||||
<string name="days_ago">%1$.1f ημέρες πριν</string>
|
||||
<string name="days_ago_round">%1$.0f ημέρες πριν</string>
|
||||
<string name="in_days">σε %1$.0f ημέρες</string>
|
||||
<string name="in_days_round">σε %1$.0f ημέρες</string>
|
||||
<string name="shorthour">h</string>
|
||||
<string name="days">ημέρες</string>
|
||||
<string name="hours">ώρες</string>
|
||||
<string name="unit_second">δευτερόλεπτο</string>
|
||||
<string name="unit_minute">λεπτό</string>
|
||||
<string name="unit_hour">ώρα</string>
|
||||
<string name="unit_day">ημέρα</string>
|
||||
<string name="unit_week">εβδομάδα</string>
|
||||
<string name="unit_seconds">δευτερόλεπτα</string>
|
||||
<string name="unit_minutes">λεπτά</string>
|
||||
<string name="unit_hours">ώρες</string>
|
||||
<string name="unit_days">ημέρες</string>
|
||||
<string name="unit_weeks">εβδομάδες</string>
|
||||
<string name="shortminute">m</string>
|
||||
<string name="shortday">ημ</string>
|
||||
<string name="later_today">Αργότερα σήμερα</string>
|
||||
<string name="tomorrow">Αύριο</string>
|
||||
<string name="today">Σήμερα</string>
|
||||
<string name="yesterday">Χθες</string>
|
||||
<!-- Rx -->
|
||||
<string name="connecting_for">Σύνδεση για %1$d δευτερόλεπτα</string>
|
||||
<string name="handshaking">Δημιουργία σύνδεσης</string>
|
||||
<string name="connected">Συνδέθηκε</string>
|
||||
<string name="disconnecting">Αποσυνδέεται</string>
|
||||
<string name="waiting_for_disconnection">Αναμονή για αποσύνδεση</string>
|
||||
<!-- Custom Watchface -->
|
||||
<string name="metadata_label_watchface_created_at">Δημιουργήθηκε: %1$s</string>
|
||||
<string name="metadata_label_watchface_author">Συντάκτης: %1$s</string>
|
||||
<string name="metadata_label_watchface_name">Όνομα: %1$s</string>
|
||||
<string name="metadata_wear_import_filename">Όνομα αρχείου: %1$s</string>
|
||||
<string name="metadata_label_plugin_version">Έκδοση πρόσθετου: %1$s</string>
|
||||
<string name="metadata_label_watchface_name_version">Όνομα: %1$s (%2$s)</string>
|
||||
<string name="metadata_label_watchface_infos">Πληροφορίες: %1$s</string>
|
||||
<string name="pref_show_iob">Εμφάνιση IOB</string>
|
||||
<string name="pref_show_detailed_iob">Εμφάνιση λεπτομερούς IOB</string>
|
||||
<string name="pref_show_cob">Εμφάνιση COB</string>
|
||||
<string name="pref_show_delta">Εμφάνιση Διαφοράς</string>
|
||||
<string name="pref_show_detailed_delta">Εμφάνιση λεπτομερούς Διαφοράς</string>
|
||||
<string name="pref_show_avgdelta">Εμφάνιση Μέσης Διαφοράς</string>
|
||||
<string name="pref_show_phone_battery">Εμφάνιση Μπαταρίας Τηλεφώνου</string>
|
||||
<string name="pref_show_rig_battery">Εμφάνιση Μπαταρίας Rig</string>
|
||||
<string name="pref_show_basal_rate">Εμφάνιση Βασικού Ρυθμού</string>
|
||||
<string name="pref_show_loop_status">Εμφάνιση Κατάστασης Κυκλώματος</string>
|
||||
<string name="pref_show_bg">Εμφάνιση γλυκόζης αίματος</string>
|
||||
<string name="pref_show_bgi">Εμφάνιση BGI</string>
|
||||
<string name="pref_show_direction_arrow">Εμφάνιση Βέλους Κατεύθυνσης</string>
|
||||
<string name="pref_show_ago">Εμφάνιση Πριν</string>
|
||||
<string name="default_custom_watchface_comment">Προεπιλεγμένη πρόσοψη ρολογιού, μπορείτε να κάνετε κλικ στο κουμπί ΕΞΑΓΩΓΗ ΠΡΟΣΟΨΗΣ για να δημιουργήσετε ένα πρότυπο</string>
|
||||
<string name="wear_default_watchface">Προεπιλεγμένη πρόσοψη ρολογιού</string>
|
||||
<string name="cwf_comment_background">Εικόνα φόντου</string>
|
||||
<string name="cwf_comment_chart">Γραφήματα (BG, βασικός, γραμμές πρόβλεψης...)</string>
|
||||
<string name="cwf_comment_cover_chart">Εικόνα μπροστά από το γράφημα και πίσω από τα πεδία κειμένου</string>
|
||||
<string name="cwf_comment_freetext1">Ελεύθερο κείμενο 1</string>
|
||||
<string name="cwf_comment_freetext2">Ελεύθερο κείμενο 2</string>
|
||||
<string name="cwf_comment_freetext3">Ελεύθερο κείμενο 3</string>
|
||||
<string name="cwf_comment_freetext4">Ελεύθερο κείμενο 4</string>
|
||||
<string name="cwf_comment_iob1">Ετικέτα IOB ή Άθροισμα IOB εάν είναι λεπτομερές</string>
|
||||
<string name="cwf_comment_iob2">Άθροισμα IOB ή (Bolus_IOB|Basal_IOB) εάν είναι λεπτομερές</string>
|
||||
<string name="cwf_comment_cob1">Ετικέτα COB</string>
|
||||
<string name="cwf_comment_cob2">Τιμή COB</string>
|
||||
<string name="cwf_comment_delta">Βραχυπρόθεσμη διαφορά BG</string>
|
||||
<string name="cwf_comment_avg_delta">Μέση διαφορά BG (15λεπτά)</string>
|
||||
<string name="cwf_comment_uploader_battery">Μπαταρία τηλεφώνου (%)</string>
|
||||
<string name="cwf_comment_rig_battery">Μπαταρία συνολικού κυκλώματος (%)</string>
|
||||
<string name="cwf_comment_basalRate">Βασικός Ρυθμός</string>
|
||||
<string name="cwf_comment_bgi">Τιμή BGI</string>
|
||||
<string name="cwf_comment_time">Ώρα (ΩΩ:ΛΛ ή ΩΩ:ΜΜ:ΣΣ)</string>
|
||||
<string name="cwf_comment_hour">Ώρα (HH)</string>
|
||||
<string name="cwf_comment_minute">Λεπτό (MM)</string>
|
||||
<string name="cwf_comment_second">Δευτερόλεπτο (SS)</string>
|
||||
<string name="cwf_comment_timePeriod">ΠΜ ή ΜΜ</string>
|
||||
<string name="cwf_comment_day_name">Όνομα της ημέρας της εβδομάδας</string>
|
||||
<string name="cwf_comment_day">Ημέρα (DD)</string>
|
||||
<string name="cwf_comment_month">Όνομα μήνα (σύντομο)</string>
|
||||
<string name="cwf_comment_loop">Κατάσταση κυκλώματος και πριν</string>
|
||||
<string name="cwf_comment_direction">Βέλος κατεύθυνσης</string>
|
||||
<string name="cwf_comment_timestamp">Λεπτά πριν από την τελευταία λήψη BG</string>
|
||||
<string name="cwf_comment_sgv">Τιμή γλυκόζης αίματος</string>
|
||||
<string name="cwf_comment_cover_plate">Εικόνα εξωφύλλου μπροστά από το κείμενο (κλήσεις...)</string>
|
||||
<string name="cwf_comment_hour_hand">Εικόνα ώρας χεριού (Αναλογικό ρολόι)</string>
|
||||
<string name="cwf_comment_minute_hand">Εικόνα λεπτού χεριού (Αναλογικό ρολόι)</string>
|
||||
<string name="cwf_comment_second_hand">Εικόνα δευτερολέπτου χεριού (Αναλογικό ρολόι)</string>
|
||||
</resources>
|
|
@ -1,93 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- DateUtil-->
|
||||
<string name="minago">hace %1$d m</string>
|
||||
<string name="minago_long">Hace %1$d minutos</string>
|
||||
<string name="hoursago">hace %1$.1f h</string>
|
||||
<string name="days_ago">Hace %1$.1f día</string>
|
||||
<string name="days_ago_round">Hace %1$.0f días</string>
|
||||
<string name="in_days">en %1$.0f días</string>
|
||||
<string name="in_days_round">en %1$.0f días</string>
|
||||
<string name="shorthour">h</string>
|
||||
<string name="days">días</string>
|
||||
<string name="hours">horas</string>
|
||||
<string name="unit_second">segundo</string>
|
||||
<string name="unit_minute">minuto</string>
|
||||
<string name="unit_hour">hora</string>
|
||||
<string name="unit_day">día</string>
|
||||
<string name="unit_week">semana</string>
|
||||
<string name="unit_seconds">segundos</string>
|
||||
<string name="unit_minutes">minutos</string>
|
||||
<string name="unit_hours">horas</string>
|
||||
<string name="unit_days">días</string>
|
||||
<string name="unit_weeks">semanas</string>
|
||||
<string name="shortminute">m</string>
|
||||
<string name="shortday">d</string>
|
||||
<string name="later_today">Más tarde hoy</string>
|
||||
<string name="tomorrow">Mañana</string>
|
||||
<string name="today">Hoy</string>
|
||||
<string name="yesterday">Ayer</string>
|
||||
<!-- Rx -->
|
||||
<string name="connecting_for">Conectando durante %1$d s</string>
|
||||
<string name="handshaking">Estableciendo comunicación</string>
|
||||
<string name="connected">Conectado</string>
|
||||
<string name="disconnecting">Desconectando</string>
|
||||
<string name="waiting_for_disconnection">Esperando la desconexión</string>
|
||||
<!-- Custom Watchface -->
|
||||
<string name="metadata_label_watchface_created_at">Creada: %1$s</string>
|
||||
<string name="metadata_label_watchface_author">Autor: %1$s</string>
|
||||
<string name="metadata_label_watchface_name">Nombre: %1$s</string>
|
||||
<string name="metadata_wear_import_filename">Nombre del archivo: %1$s</string>
|
||||
<string name="metadata_label_plugin_version">Versión del plugin: %1$s</string>
|
||||
<string name="metadata_label_watchface_name_version">Nombre: %1$s (%2$s)</string>
|
||||
<string name="metadata_label_watchface_infos">Info: %1$s</string>
|
||||
<string name="pref_show_iob">Mostrar IOB</string>
|
||||
<string name="pref_show_detailed_iob">Mostrar IOB detallada</string>
|
||||
<string name="pref_show_cob">Mostrar COB</string>
|
||||
<string name="pref_show_delta">Mostrar delta</string>
|
||||
<string name="pref_show_detailed_delta">Mostrar delta detallado</string>
|
||||
<string name="pref_show_avgdelta">Mostrar delta promedio</string>
|
||||
<string name="pref_show_phone_battery">Mostrar batería del teléfono</string>
|
||||
<string name="pref_show_rig_battery">Mostrar batería global del lazo</string>
|
||||
<string name="pref_show_basal_rate">Mostrar la tasa basal</string>
|
||||
<string name="pref_show_loop_status">Mostrar estado del lazo</string>
|
||||
<string name="pref_show_bg">Mostrar glucosa</string>
|
||||
<string name="pref_show_bgi">Mostrar BGI (Índice de glucosa en sangre)</string>
|
||||
<string name="pref_show_direction_arrow">Mostrar flecha de dirección</string>
|
||||
<string name="pref_show_ago">Mostrar \"hace\"</string>
|
||||
<string name="default_custom_watchface_comment">Esfera predeterminada, puedes hacer clic en el botón EXPORTAR ESFERA para generar una plantilla</string>
|
||||
<string name="wear_default_watchface">Esfera por defecto</string>
|
||||
<string name="cwf_comment_background">Imagen de fondo</string>
|
||||
<string name="cwf_comment_chart">Gráficos (glucosa, basal, líneas de predicción...)</string>
|
||||
<string name="cwf_comment_cover_chart">Imagen frente al gráfico y detrás de campos de texto</string>
|
||||
<string name="cwf_comment_freetext1">Texto libre 1</string>
|
||||
<string name="cwf_comment_freetext2">Texto libre 2</string>
|
||||
<string name="cwf_comment_freetext3">Texto libre 3</string>
|
||||
<string name="cwf_comment_freetext4">Texto libre 4</string>
|
||||
<string name="cwf_comment_iob1">Etiqueta IOB o Suma IOB si es detallada</string>
|
||||
<string name="cwf_comment_iob2">Suma de IOB o (Bolos_IOB|Basal_IOB) si se detalla</string>
|
||||
<string name="cwf_comment_cob1">Etiqueta COB</string>
|
||||
<string name="cwf_comment_cob2">Valor COB</string>
|
||||
<string name="cwf_comment_delta">Delta corto de glucosa</string>
|
||||
<string name="cwf_comment_avg_delta">Delta promedio de glucosa (15min)</string>
|
||||
<string name="cwf_comment_uploader_battery">Batería del teléfono (%)</string>
|
||||
<string name="cwf_comment_rig_battery">Batería global de lazo (%)</string>
|
||||
<string name="cwf_comment_basalRate">Tasa Basal</string>
|
||||
<string name="cwf_comment_bgi">Valor BGI</string>
|
||||
<string name="cwf_comment_time">Tiempo (HH:MM o HH:MM:SS)</string>
|
||||
<string name="cwf_comment_hour">Hora (HH)</string>
|
||||
<string name="cwf_comment_minute">Minuto (MM)</string>
|
||||
<string name="cwf_comment_second">Segundo (SS)</string>
|
||||
<string name="cwf_comment_timePeriod">AM o PM</string>
|
||||
<string name="cwf_comment_day_name">Nombre del día de la semana</string>
|
||||
<string name="cwf_comment_day">Día (DD)</string>
|
||||
<string name="cwf_comment_month">Nombre del mes (corto)</string>
|
||||
<string name="cwf_comment_loop">Estado del bucle y hace</string>
|
||||
<string name="cwf_comment_direction">Flecha de dirección</string>
|
||||
<string name="cwf_comment_timestamp">Minutos atrás del último valor de glucosa recibido</string>
|
||||
<string name="cwf_comment_sgv">Valor de glucosa</string>
|
||||
<string name="cwf_comment_cover_plate">Imagen de portada delante del texto (diales...)</string>
|
||||
<string name="cwf_comment_hour_hand">Imagen de la aguja horaria (reloj analógico)</string>
|
||||
<string name="cwf_comment_minute_hand">Imagen del minutero (reloj analógico)</string>
|
||||
<string name="cwf_comment_second_hand">Imagen del segundero (reloj analógico)</string>
|
||||
</resources>
|
|
@ -1,93 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- DateUtil-->
|
||||
<string name="minago">il y a %1$d m</string>
|
||||
<string name="minago_long">Il y a %1$d minutes</string>
|
||||
<string name="hoursago">il y a %1$.1f h</string>
|
||||
<string name="days_ago">Il y a %1$.1f jours</string>
|
||||
<string name="days_ago_round">Il y a %1$.0f jours</string>
|
||||
<string name="in_days">en %1$.0f jours</string>
|
||||
<string name="in_days_round">en %1$.0f jours</string>
|
||||
<string name="shorthour">h</string>
|
||||
<string name="days">jours</string>
|
||||
<string name="hours">heures</string>
|
||||
<string name="unit_second">seconde</string>
|
||||
<string name="unit_minute">minute</string>
|
||||
<string name="unit_hour">heure</string>
|
||||
<string name="unit_day">jour</string>
|
||||
<string name="unit_week">semaine</string>
|
||||
<string name="unit_seconds">secondes</string>
|
||||
<string name="unit_minutes">minutes</string>
|
||||
<string name="unit_hours">heures</string>
|
||||
<string name="unit_days">jours</string>
|
||||
<string name="unit_weeks">semaines</string>
|
||||
<string name="shortminute">m</string>
|
||||
<string name="shortday">j</string>
|
||||
<string name="later_today">Plus tard aujourd\'hui</string>
|
||||
<string name="tomorrow">Demain</string>
|
||||
<string name="today">Aujourd’hui</string>
|
||||
<string name="yesterday">Hier</string>
|
||||
<!-- Rx -->
|
||||
<string name="connecting_for">Connexion en cours %1$ds</string>
|
||||
<string name="handshaking">Connexion</string>
|
||||
<string name="connected">Connectée</string>
|
||||
<string name="disconnecting">Déconnexion en cours</string>
|
||||
<string name="waiting_for_disconnection">Attente de déconnexion</string>
|
||||
<!-- Custom Watchface -->
|
||||
<string name="metadata_label_watchface_created_at">Créé le : %1$s</string>
|
||||
<string name="metadata_label_watchface_author">Auteur : %1$s</string>
|
||||
<string name="metadata_label_watchface_name">Nom : %1$s</string>
|
||||
<string name="metadata_wear_import_filename">Nom du fichier : %1$s</string>
|
||||
<string name="metadata_label_plugin_version">Version du plugin : %1$s</string>
|
||||
<string name="metadata_label_watchface_name_version">Nom : %1$s (%2$s)</string>
|
||||
<string name="metadata_label_watchface_infos">Infos : %1$s</string>
|
||||
<string name="pref_show_iob">Afficher IA</string>
|
||||
<string name="pref_show_detailed_iob">Afficher IA détaillée</string>
|
||||
<string name="pref_show_cob">Afficher GA</string>
|
||||
<string name="pref_show_delta">Montrer le delta</string>
|
||||
<string name="pref_show_detailed_delta">Afficher Delta Détaillé</string>
|
||||
<string name="pref_show_avgdelta">Afficher le delta moyen</string>
|
||||
<string name="pref_show_phone_battery">Afficher la batterie du téléphone</string>
|
||||
<string name="pref_show_rig_battery">Afficher la batterie de la plateforme </string>
|
||||
<string name="pref_show_basal_rate">Afficher Basale</string>
|
||||
<string name="pref_show_loop_status">Afficher État Boucle</string>
|
||||
<string name="pref_show_bg">Afficher Glycémie</string>
|
||||
<string name="pref_show_bgi">Afficher IGly</string>
|
||||
<string name="pref_show_direction_arrow">Afficher Flèche</string>
|
||||
<string name="pref_show_ago">Afficher Min Passées</string>
|
||||
<string name="default_custom_watchface_comment">Cadran par défaut, vous pouvez cliquer sur le bouton EXPORTER WATCHFACE pour générer un modèle</string>
|
||||
<string name="wear_default_watchface">Cadran par défaut</string>
|
||||
<string name="cwf_comment_background">Image d\'arrière-plan</string>
|
||||
<string name="cwf_comment_chart">Graphiques (Gly, basal, lignes de prédiction...)</string>
|
||||
<string name="cwf_comment_cover_chart">Image devant le graphique et derrière les champs de texte</string>
|
||||
<string name="cwf_comment_freetext1">Texte libre 1</string>
|
||||
<string name="cwf_comment_freetext2">Texte libre 2</string>
|
||||
<string name="cwf_comment_freetext3">Texte libre 3</string>
|
||||
<string name="cwf_comment_freetext4">Texte libre 4</string>
|
||||
<string name="cwf_comment_iob1">Libellé \"IA\" ou valeur IA globale si détaillé Ok</string>
|
||||
<string name="cwf_comment_iob2">Valeur IA globale ou (IA_Bolus|IA_Basal) si détaillé Ok</string>
|
||||
<string name="cwf_comment_cob1">Libellé \"GA\"</string>
|
||||
<string name="cwf_comment_cob2">Valeur de GA</string>
|
||||
<string name="cwf_comment_delta">Delta Glycémie (5min)</string>
|
||||
<string name="cwf_comment_avg_delta">Delta glycémie moyen (15min)</string>
|
||||
<string name="cwf_comment_uploader_battery">Batterie du téléphone (%)</string>
|
||||
<string name="cwf_comment_rig_battery">Batterie de la boucle globale (%)</string>
|
||||
<string name="cwf_comment_basalRate">Débit Basal</string>
|
||||
<string name="cwf_comment_bgi">Valeur de IGly</string>
|
||||
<string name="cwf_comment_time">Heure (HH:MM ou HH:MM:SS)</string>
|
||||
<string name="cwf_comment_hour">Heure (HH)</string>
|
||||
<string name="cwf_comment_minute">Minute (MM)</string>
|
||||
<string name="cwf_comment_second">Seconde (SS)</string>
|
||||
<string name="cwf_comment_timePeriod">AM ou PM</string>
|
||||
<string name="cwf_comment_day_name">Nom du jour de la semaine</string>
|
||||
<string name="cwf_comment_day">Jour (JJ)</string>
|
||||
<string name="cwf_comment_month">Nom du mois (court)</string>
|
||||
<string name="cwf_comment_loop">État de la boucle et délais</string>
|
||||
<string name="cwf_comment_direction">Flèche de direction</string>
|
||||
<string name="cwf_comment_timestamp">Minutes depuis la dernière Glycémie reçue</string>
|
||||
<string name="cwf_comment_sgv">Valeur de Ia Gly</string>
|
||||
<string name="cwf_comment_cover_plate">Image de couverture devant le texte (cadrans...)</string>
|
||||
<string name="cwf_comment_hour_hand">Image de l\'aiģuille de l\'heure (Montre Analogique)</string>
|
||||
<string name="cwf_comment_minute_hand">Image de l\'aiguille des minutes (Montre Analogique)</string>
|
||||
<string name="cwf_comment_second_hand">Image de l\'aiguille des secondes (Montre Analogique)</string>
|
||||
</resources>
|
|
@ -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">lá</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">lá</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">lá</string>
|
||||
<string name="unit_weeks">seachtaine</string>
|
||||
<string name="shortminute">n</string>
|
||||
<string name="shortday">lá</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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -1,93 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- DateUtil-->
|
||||
<string name="minago">prieš %1$d min.</string>
|
||||
<string name="minago_long">Prieš %1$d min.</string>
|
||||
<string name="hoursago">Prieš %1$.1f val.</string>
|
||||
<string name="days_ago">Prieš %1$s d.</string>
|
||||
<string name="days_ago_round">Prieš %1$.0f d.</string>
|
||||
<string name="in_days">Po %1$.0f d.</string>
|
||||
<string name="in_days_round">Po %1$.0f d.</string>
|
||||
<string name="shorthour">val.</string>
|
||||
<string name="days">d.</string>
|
||||
<string name="hours">val.</string>
|
||||
<string name="unit_second">sek.</string>
|
||||
<string name="unit_minute">min.</string>
|
||||
<string name="unit_hour">val.</string>
|
||||
<string name="unit_day">d.</string>
|
||||
<string name="unit_week">sav.</string>
|
||||
<string name="unit_seconds">sekundės</string>
|
||||
<string name="unit_minutes"> min.</string>
|
||||
<string name="unit_hours">val.</string>
|
||||
<string name="unit_days">d.</string>
|
||||
<string name="unit_weeks">savaičių</string>
|
||||
<string name="shortminute">m</string>
|
||||
<string name="shortday">d</string>
|
||||
<string name="later_today">Šiandien vėliau</string>
|
||||
<string name="tomorrow">Rytoj</string>
|
||||
<string name="today">Šiandien</string>
|
||||
<string name="yesterday">Vakar</string>
|
||||
<!-- Rx -->
|
||||
<string name="connecting_for">Jungiamasi %1$d s</string>
|
||||
<string name="handshaking">Ryšio užmezgimas</string>
|
||||
<string name="connected">Prisijungta</string>
|
||||
<string name="disconnecting">Atsijungiama</string>
|
||||
<string name="waiting_for_disconnection">Laukiama atsijungimo</string>
|
||||
<!-- Custom Watchface -->
|
||||
<string name="metadata_label_watchface_created_at">Sukurta: %1$s</string>
|
||||
<string name="metadata_label_watchface_author">Autorius: %1$s</string>
|
||||
<string name="metadata_label_watchface_name">Vardas: %1$s</string>
|
||||
<string name="metadata_wear_import_filename">Failo pavadinimas: %1$s</string>
|
||||
<string name="metadata_label_plugin_version">Įskiepio versija: %1$s</string>
|
||||
<string name="metadata_label_watchface_name_version">Pavadinimas: %1$s (%2$s)</string>
|
||||
<string name="metadata_label_watchface_infos">Info: %1$s</string>
|
||||
<string name="pref_show_iob">Rodyti AIO</string>
|
||||
<string name="pref_show_detailed_iob">Rodyti detalų AIO</string>
|
||||
<string name="pref_show_cob">Rodyti AAO</string>
|
||||
<string name="pref_show_delta">Rodyti pokytį</string>
|
||||
<string name="pref_show_detailed_delta">Rodyti glikemijos pokyčius detaliai</string>
|
||||
<string name="pref_show_avgdelta">Rodyti vidutinį pokytį</string>
|
||||
<string name="pref_show_phone_battery">Rodyti telefono bateriją</string>
|
||||
<string name="pref_show_rig_battery">Rodyti įrenginio bateriją</string>
|
||||
<string name="pref_show_basal_rate">Rodyti valandinę bazę</string>
|
||||
<string name="pref_show_loop_status">Rodyti Ciklo statusą</string>
|
||||
<string name="pref_show_bg">Rodyti KG</string>
|
||||
<string name="pref_show_bgi">Rodyti GĮ</string>
|
||||
<string name="pref_show_direction_arrow">Rodyti krypties rodyklę</string>
|
||||
<string name="pref_show_ago">Laikas nuo pask. vertės</string>
|
||||
<string name="default_custom_watchface_comment">Numatytasis ekranas. Paspaudus EKSPORTUOTI, bus sukurtas ruošinys</string>
|
||||
<string name="wear_default_watchface">Numatytasis ekranas</string>
|
||||
<string name="cwf_comment_background">Fono paveiksliukas</string>
|
||||
<string name="cwf_comment_chart">Grafikai (glikemija, bazė, prognozės...)</string>
|
||||
<string name="cwf_comment_cover_chart">Paveiksliukas už teksto ir prieš grafiką</string>
|
||||
<string name="cwf_comment_freetext1">Laisvas tekstas 1</string>
|
||||
<string name="cwf_comment_freetext2">Laisvas tekstas 2</string>
|
||||
<string name="cwf_comment_freetext3">Laisvas tekstas 3</string>
|
||||
<string name="cwf_comment_freetext4">Laisvas tekstas 4</string>
|
||||
<string name="cwf_comment_iob1">Sudėtinis arba detalus AIO</string>
|
||||
<string name="cwf_comment_iob2">Sudėtinis arba detalus (Boluso_AIO|Bazės_AIO) AIO</string>
|
||||
<string name="cwf_comment_cob1">AAO žyma</string>
|
||||
<string name="cwf_comment_cob2">AAO vertė</string>
|
||||
<string name="cwf_comment_delta">Trumpo laikotarpio pokytis</string>
|
||||
<string name="cwf_comment_avg_delta">Vidutinis pokytis (15 min)</string>
|
||||
<string name="cwf_comment_uploader_battery">Telefono baterija (%)</string>
|
||||
<string name="cwf_comment_rig_battery">Baterija (%)</string>
|
||||
<string name="cwf_comment_basalRate">Bazė</string>
|
||||
<string name="cwf_comment_bgi">KGI vertė</string>
|
||||
<string name="cwf_comment_time">Laikas (val:min arba val:min:sek)</string>
|
||||
<string name="cwf_comment_hour">Val.</string>
|
||||
<string name="cwf_comment_minute">Min.</string>
|
||||
<string name="cwf_comment_second">Sek.</string>
|
||||
<string name="cwf_comment_timePeriod">AM ar PM</string>
|
||||
<string name="cwf_comment_day_name">Savaitės diena</string>
|
||||
<string name="cwf_comment_day">Diena (d.)</string>
|
||||
<string name="cwf_comment_month">Mėnuo (sutrump.)</string>
|
||||
<string name="cwf_comment_loop">Ciklo būsena</string>
|
||||
<string name="cwf_comment_direction">Tendencijos rodyklė</string>
|
||||
<string name="cwf_comment_timestamp">Prieš kiek minučių nuskaityta glikemija</string>
|
||||
<string name="cwf_comment_sgv">Glikemija</string>
|
||||
<string name="cwf_comment_cover_plate">Paveiksliukas prieš tekstą (skambučius...)</string>
|
||||
<string name="cwf_comment_hour_hand">Analoginio laikrodžio valandinė rodyklė</string>
|
||||
<string name="cwf_comment_minute_hand">Analoginio laikrodžio minutinė rodyklė</string>
|
||||
<string name="cwf_comment_second_hand">Analoginio laikrodžio sekundinė rodyklė</string>
|
||||
</resources>
|
|
@ -1,93 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- DateUtil-->
|
||||
<string name="minago">%1$d m geleden</string>
|
||||
<string name="minago_long">%1$d minuten geleden</string>
|
||||
<string name="hoursago">%1$.1f uur geleden</string>
|
||||
<string name="days_ago">%1$.1f dagen geleden</string>
|
||||
<string name="days_ago_round">%1$.0f dagen geleden</string>
|
||||
<string name="in_days">over %1$.0f dagen</string>
|
||||
<string name="in_days_round">binnen %1$.0f dagen</string>
|
||||
<string name="shorthour">u</string>
|
||||
<string name="days">dagen</string>
|
||||
<string name="hours">uren</string>
|
||||
<string name="unit_second">seconde</string>
|
||||
<string name="unit_minute">minuut</string>
|
||||
<string name="unit_hour">uur</string>
|
||||
<string name="unit_day">dag</string>
|
||||
<string name="unit_week">week</string>
|
||||
<string name="unit_seconds">seconden</string>
|
||||
<string name="unit_minutes">minuten</string>
|
||||
<string name="unit_hours">uren</string>
|
||||
<string name="unit_days">dagen</string>
|
||||
<string name="unit_weeks">weken</string>
|
||||
<string name="shortminute">m</string>
|
||||
<string name="shortday">d</string>
|
||||
<string name="later_today">Later vandaag</string>
|
||||
<string name="tomorrow">Morgen</string>
|
||||
<string name="today">Vandaag</string>
|
||||
<string name="yesterday">Gisteren</string>
|
||||
<!-- Rx -->
|
||||
<string name="connecting_for">Verbonden gedurende %1$d s</string>
|
||||
<string name="handshaking">Handshaking</string>
|
||||
<string name="connected">Verbonden</string>
|
||||
<string name="disconnecting">Verbinding aan het verbreken</string>
|
||||
<string name="waiting_for_disconnection">Wachten op het loskoppelen</string>
|
||||
<!-- Custom Watchface -->
|
||||
<string name="metadata_label_watchface_created_at">Gemaakt op: %1$s</string>
|
||||
<string name="metadata_label_watchface_author">Auteur: %1$s</string>
|
||||
<string name="metadata_label_watchface_name">Naam: %1$s</string>
|
||||
<string name="metadata_wear_import_filename">Bestandsnaam: %1$s</string>
|
||||
<string name="metadata_label_plugin_version">Plugin versie: %1$s</string>
|
||||
<string name="metadata_label_watchface_name_version">Naam: %1$s (%2$s)</string>
|
||||
<string name="metadata_label_watchface_infos">Info: %1$s</string>
|
||||
<string name="pref_show_iob">Toon IOB</string>
|
||||
<string name="pref_show_detailed_iob">Toon gedetailleerde IOB</string>
|
||||
<string name="pref_show_cob">Toon COB</string>
|
||||
<string name="pref_show_delta">Toon Delta</string>
|
||||
<string name="pref_show_detailed_delta">Toon gedetailleerde Delta</string>
|
||||
<string name="pref_show_avgdelta">Toon gemiddelde delta</string>
|
||||
<string name="pref_show_phone_battery">Toon Telefoon Batterij</string>
|
||||
<string name="pref_show_rig_battery">Toon Rig batterij</string>
|
||||
<string name="pref_show_basal_rate">Toon basaalstand</string>
|
||||
<string name="pref_show_loop_status">Toon Loop Status</string>
|
||||
<string name="pref_show_bg">Toon BG</string>
|
||||
<string name="pref_show_bgi">Toon BGI</string>
|
||||
<string name="pref_show_direction_arrow">Toon richtingspijl</string>
|
||||
<string name="pref_show_ago">Toon tijd geleden</string>
|
||||
<string name="default_custom_watchface_comment">Standaard watchface, u kunt op de EXPORT WATCHFACE knop klikken om een sjabloon te genereren</string>
|
||||
<string name="wear_default_watchface">Standaard watchface</string>
|
||||
<string name="cwf_comment_background">Achtergrondafbeelding</string>
|
||||
<string name="cwf_comment_chart">Grafieken (BG, basaal, voorspellingslijnen...)</string>
|
||||
<string name="cwf_comment_cover_chart">Afbeelding voor de grafiek en achter tekstvelden</string>
|
||||
<string name="cwf_comment_freetext1">Vrije tekst 1</string>
|
||||
<string name="cwf_comment_freetext2">Vrije tekst 2</string>
|
||||
<string name="cwf_comment_freetext3">Vrije tekst 3</string>
|
||||
<string name="cwf_comment_freetext4">Vrije tekst 4</string>
|
||||
<string name="cwf_comment_iob1">IOB label of IOB totaal indien gedetailleerd</string>
|
||||
<string name="cwf_comment_iob2">IOB totaal of (Bolus_IOB|Basal_IOB) indien gedetailleerd</string>
|
||||
<string name="cwf_comment_cob1">COB label</string>
|
||||
<string name="cwf_comment_cob2">COB waarde</string>
|
||||
<string name="cwf_comment_delta">Korte BG delta</string>
|
||||
<string name="cwf_comment_avg_delta">Gemiddelde BG delta (15min)</string>
|
||||
<string name="cwf_comment_uploader_battery">Batterij Telefoon (%)</string>
|
||||
<string name="cwf_comment_rig_battery">Globale loop batterij (%)</string>
|
||||
<string name="cwf_comment_basalRate">Basaal stand</string>
|
||||
<string name="cwf_comment_bgi">BGI waarde</string>
|
||||
<string name="cwf_comment_time">Tijd (UU:MM of UU:MM:SS)</string>
|
||||
<string name="cwf_comment_hour">Uur (UU)</string>
|
||||
<string name="cwf_comment_minute">Minuut (MM)</string>
|
||||
<string name="cwf_comment_second">Seconde (SS)</string>
|
||||
<string name="cwf_comment_timePeriod">AM of PM</string>
|
||||
<string name="cwf_comment_day_name">Naam van de dag van de week</string>
|
||||
<string name="cwf_comment_day">Dag (DD)</string>
|
||||
<string name="cwf_comment_month">Maand (kort)</string>
|
||||
<string name="cwf_comment_loop">Loop status en tijd geleden</string>
|
||||
<string name="cwf_comment_direction">Richtingspijl</string>
|
||||
<string name="cwf_comment_timestamp">Minuten geleden voor laatst ontvangen BG</string>
|
||||
<string name="cwf_comment_sgv">BG waarde</string>
|
||||
<string name="cwf_comment_cover_plate">Masker afbeelding over tekst (bijv. uren indicators)</string>
|
||||
<string name="cwf_comment_hour_hand">Afbeelding van uren wijzer (analoog horloge)</string>
|
||||
<string name="cwf_comment_minute_hand">Afbeelding van minuut wijzer (analoog horloge)</string>
|
||||
<string name="cwf_comment_second_hand">Afbeelding van seconde wijzer (analoog horloge)</string>
|
||||
</resources>
|
|
@ -1,93 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- DateUtil-->
|
||||
<string name="minago">%1$d min siden</string>
|
||||
<string name="minago_long">%1$d minutter siden</string>
|
||||
<string name="hoursago">%1$.1f timer siden</string>
|
||||
<string name="days_ago">%1$.1f dager siden</string>
|
||||
<string name="days_ago_round">%1$.0f dager siden</string>
|
||||
<string name="in_days">om %1$.0f dager</string>
|
||||
<string name="in_days_round">om %1$.0f dager</string>
|
||||
<string name="shorthour">t</string>
|
||||
<string name="days">dager</string>
|
||||
<string name="hours">timer</string>
|
||||
<string name="unit_second">sekund</string>
|
||||
<string name="unit_minute">minutt</string>
|
||||
<string name="unit_hour">time</string>
|
||||
<string name="unit_day">dag</string>
|
||||
<string name="unit_week">uke</string>
|
||||
<string name="unit_seconds">sekunder</string>
|
||||
<string name="unit_minutes">minutter</string>
|
||||
<string name="unit_hours">timer</string>
|
||||
<string name="unit_days">dager</string>
|
||||
<string name="unit_weeks">uker</string>
|
||||
<string name="shortminute">m</string>
|
||||
<string name="shortday">d</string>
|
||||
<string name="later_today">Senere i dag</string>
|
||||
<string name="tomorrow">I morgen</string>
|
||||
<string name="today">Idag</string>
|
||||
<string name="yesterday">I går</string>
|
||||
<!-- Rx -->
|
||||
<string name="connecting_for">Tilkobler i %1$d sek</string>
|
||||
<string name="handshaking">Tilkobling verifiseres</string>
|
||||
<string name="connected">Tilkoblet</string>
|
||||
<string name="disconnecting">Frakobler</string>
|
||||
<string name="waiting_for_disconnection">Venter på frakobling</string>
|
||||
<!-- Custom Watchface -->
|
||||
<string name="metadata_label_watchface_created_at">Opprettet: %1$s</string>
|
||||
<string name="metadata_label_watchface_author">Laget av: %1$s</string>
|
||||
<string name="metadata_label_watchface_name">Navn: %1$s</string>
|
||||
<string name="metadata_wear_import_filename">Filnavn: %1$s</string>
|
||||
<string name="metadata_label_plugin_version">Plugin-versjon: %1$s</string>
|
||||
<string name="metadata_label_watchface_name_version">Navn: %1$s (%2$s)</string>
|
||||
<string name="metadata_label_watchface_infos">Info: %1$s</string>
|
||||
<string name="pref_show_iob">Vis IOB</string>
|
||||
<string name="pref_show_detailed_iob">Vis detaljert IOB</string>
|
||||
<string name="pref_show_cob">Vis COB</string>
|
||||
<string name="pref_show_delta">Vis Delta</string>
|
||||
<string name="pref_show_detailed_delta">Vis detaljert Delta</string>
|
||||
<string name="pref_show_avgdelta">Vis Gj. snitt Delta</string>
|
||||
<string name="pref_show_phone_battery">Vis telefonbatteri</string>
|
||||
<string name="pref_show_rig_battery">Vis riggens batteri</string>
|
||||
<string name="pref_show_basal_rate">Vis basalrate</string>
|
||||
<string name="pref_show_loop_status">Vis loop status</string>
|
||||
<string name="pref_show_bg">Vis BS</string>
|
||||
<string name="pref_show_bgi">Vis BS</string>
|
||||
<string name="pref_show_direction_arrow">Vis retningspil</string>
|
||||
<string name="pref_show_ago">Vis tid siden</string>
|
||||
<string name="default_custom_watchface_comment">Standard klokkebakgrunn, du kan klikke på EKSPORTER KLOKKEBAKGRUNN for å lage en mal</string>
|
||||
<string name="wear_default_watchface">Standard klokkebakgrunn</string>
|
||||
<string name="cwf_comment_background">Bakgrunnsbilde</string>
|
||||
<string name="cwf_comment_chart">Grafer (BS, basal, prediksjonslinjer...)</string>
|
||||
<string name="cwf_comment_cover_chart">Bilde foran grafer og bak tekstfelter</string>
|
||||
<string name="cwf_comment_freetext1">Fritekst 1</string>
|
||||
<string name="cwf_comment_freetext2">Fritekst 2</string>
|
||||
<string name="cwf_comment_freetext3">Fritekst 3</string>
|
||||
<string name="cwf_comment_freetext4">Fritekst 4</string>
|
||||
<string name="cwf_comment_iob1">IOB-merkelapp eller IOB-sum hvis angitt</string>
|
||||
<string name="cwf_comment_iob2">IOB-sum eller (Bolus_IOB|Basal_IOB) hvis angitt</string>
|
||||
<string name="cwf_comment_cob1">COB etikett</string>
|
||||
<string name="cwf_comment_cob2">COB verdi</string>
|
||||
<string name="cwf_comment_delta">Kort BS-endring</string>
|
||||
<string name="cwf_comment_avg_delta">Gj.snitt BS-endring (15min)</string>
|
||||
<string name="cwf_comment_uploader_battery">Telefonbatteri (%)</string>
|
||||
<string name="cwf_comment_rig_battery">Rig-batteri (%)</string>
|
||||
<string name="cwf_comment_basalRate">Basalrate</string>
|
||||
<string name="cwf_comment_bgi">BGI verdi</string>
|
||||
<string name="cwf_comment_time">Tid (TT:MM eller TT:MM:SS)</string>
|
||||
<string name="cwf_comment_hour">Time (TT)</string>
|
||||
<string name="cwf_comment_minute">Minutt (MM)</string>
|
||||
<string name="cwf_comment_second">Sekund (SS)</string>
|
||||
<string name="cwf_comment_timePeriod">AM eller PM</string>
|
||||
<string name="cwf_comment_day_name">Navn på ukedag</string>
|
||||
<string name="cwf_comment_day">Dag (DD)</string>
|
||||
<string name="cwf_comment_month">Navn på måned (kort)</string>
|
||||
<string name="cwf_comment_loop">Loop-status og tid siden</string>
|
||||
<string name="cwf_comment_direction">Retningspil</string>
|
||||
<string name="cwf_comment_timestamp">Minutter siden BS sist ble mottatt</string>
|
||||
<string name="cwf_comment_sgv">BS-verdi</string>
|
||||
<string name="cwf_comment_cover_plate">Bilde foran tekst (urvisere...)</string>
|
||||
<string name="cwf_comment_hour_hand">Bilde av timeviser (analog klokke)</string>
|
||||
<string name="cwf_comment_minute_hand">Bilde av minuttviser (analog klokke)</string>
|
||||
<string name="cwf_comment_second_hand">Bilde av sekundviser (analog klokke)</string>
|
||||
</resources>
|
|
@ -1,93 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- DateUtil-->
|
||||
<string name="minago">%1$d min temu</string>
|
||||
<string name="minago_long">%1$d minut temu</string>
|
||||
<string name="hoursago">%1$.1f godz. temu</string>
|
||||
<string name="days_ago">%1$.1f dni temu</string>
|
||||
<string name="days_ago_round">%1$.0f dni temu</string>
|
||||
<string name="in_days">za %1$.0f dni</string>
|
||||
<string name="in_days_round">za %1$.0f dni</string>
|
||||
<string name="shorthour">h</string>
|
||||
<string name="days">dni</string>
|
||||
<string name="hours">godzin</string>
|
||||
<string name="unit_second">sekunda</string>
|
||||
<string name="unit_minute">minuta</string>
|
||||
<string name="unit_hour">godzina</string>
|
||||
<string name="unit_day">dzień</string>
|
||||
<string name="unit_week">tydzień</string>
|
||||
<string name="unit_seconds">sekund</string>
|
||||
<string name="unit_minutes">minut</string>
|
||||
<string name="unit_hours">godzin</string>
|
||||
<string name="unit_days">dni</string>
|
||||
<string name="unit_weeks">tygodni</string>
|
||||
<string name="shortminute">m</string>
|
||||
<string name="shortday">d</string>
|
||||
<string name="later_today">Dzisiaj, później</string>
|
||||
<string name="tomorrow">Jutro</string>
|
||||
<string name="today">Dziś</string>
|
||||
<string name="yesterday">Wczoraj</string>
|
||||
<!-- Rx -->
|
||||
<string name="connecting_for">Łączenie przez %1$d s</string>
|
||||
<string name="handshaking">Nawiązywanie połączenia</string>
|
||||
<string name="connected">Połączono</string>
|
||||
<string name="disconnecting">Rozłączanie</string>
|
||||
<string name="waiting_for_disconnection">Oczekiwanie na rozłączenie</string>
|
||||
<!-- Custom Watchface -->
|
||||
<string name="metadata_label_watchface_created_at">Utworzono: %1$s</string>
|
||||
<string name="metadata_label_watchface_author">Autor: %1$s</string>
|
||||
<string name="metadata_label_watchface_name">Nazwa: %1$s</string>
|
||||
<string name="metadata_wear_import_filename">Nazwa pliku: %1$s</string>
|
||||
<string name="metadata_label_plugin_version">Wersja wtyczki: %1$s</string>
|
||||
<string name="metadata_label_watchface_name_version">Nazwa: %1$s (%2$s)</string>
|
||||
<string name="metadata_label_watchface_infos">Info: %1$s</string>
|
||||
<string name="pref_show_iob">Pokaż IOB</string>
|
||||
<string name="pref_show_detailed_iob">Pokaż szczegółowe IOB</string>
|
||||
<string name="pref_show_cob">Pokaż COB</string>
|
||||
<string name="pref_show_delta">Pokaż Deltę</string>
|
||||
<string name="pref_show_detailed_delta">Pokaż szczegółowo Deltę</string>
|
||||
<string name="pref_show_avgdelta">Pokaż Śr. Deltę</string>
|
||||
<string name="pref_show_phone_battery">Pokaż Baterię Telefonu</string>
|
||||
<string name="pref_show_rig_battery">Pokaż Baterię Zestawu</string>
|
||||
<string name="pref_show_basal_rate">Pokaż Dawkę Bazową</string>
|
||||
<string name="pref_show_loop_status">Pokaż Status Pętli</string>
|
||||
<string name="pref_show_bg">Pokaż glikemię</string>
|
||||
<string name="pref_show_bgi">Pokaż BGI</string>
|
||||
<string name="pref_show_direction_arrow">Pokaż Strzałkę Trendu</string>
|
||||
<string name="pref_show_ago">Pokaż Aktualność</string>
|
||||
<string name="default_custom_watchface_comment">Domyślna tarcza, możesz kliknąć na EXPORTUJ TARCZĘ aby wygenerować szablon</string>
|
||||
<string name="wear_default_watchface">Domyślna Tarcza</string>
|
||||
<string name="cwf_comment_background">Obraz w tle</string>
|
||||
<string name="cwf_comment_chart">Wykresy (glikemia, baza, prognozy...)</string>
|
||||
<string name="cwf_comment_cover_chart">Obraz przed wykresem i za polami tekstowymi</string>
|
||||
<string name="cwf_comment_freetext1">Wolne pole tekstowe 1</string>
|
||||
<string name="cwf_comment_freetext2">Wolne pole tekstowe 2</string>
|
||||
<string name="cwf_comment_freetext3">Wolne pole tekstowe 3</string>
|
||||
<string name="cwf_comment_freetext4">Wolne pole tekstowe 4</string>
|
||||
<string name="cwf_comment_iob1">Etykieta IOB lub suma IOB przy szczegółowym IOB</string>
|
||||
<string name="cwf_comment_iob2">Suma IOB lub (Bolus_IOB|Basal_IOB) jeśli szczegółowo</string>
|
||||
<string name="cwf_comment_cob1">Etykieta COB</string>
|
||||
<string name="cwf_comment_cob2">Wartość COB</string>
|
||||
<string name="cwf_comment_delta">Krótka delta glikemii</string>
|
||||
<string name="cwf_comment_avg_delta">Średnia delta glikemii (15min)</string>
|
||||
<string name="cwf_comment_uploader_battery">Bateria telefonu (%)</string>
|
||||
<string name="cwf_comment_rig_battery">Globalna bateria pętli (%)</string>
|
||||
<string name="cwf_comment_basalRate">Wartości bazy</string>
|
||||
<string name="cwf_comment_bgi">Wartość BGI</string>
|
||||
<string name="cwf_comment_time">Czas (HH:MM or HH:MM:SS)</string>
|
||||
<string name="cwf_comment_hour">Godzina (HH)</string>
|
||||
<string name="cwf_comment_minute">Minuta (MM)</string>
|
||||
<string name="cwf_comment_second">Sekunda (SS)</string>
|
||||
<string name="cwf_comment_timePeriod">AM lub PM</string>
|
||||
<string name="cwf_comment_day_name">Nazwa dnia tygodnia</string>
|
||||
<string name="cwf_comment_day">Dzień (DD)</string>
|
||||
<string name="cwf_comment_month">Nazwa miesiąca (krótka)</string>
|
||||
<string name="cwf_comment_loop">Status pętli i aktualność</string>
|
||||
<string name="cwf_comment_direction">Strzałka trendu</string>
|
||||
<string name="cwf_comment_timestamp">Minut od ostatniego otrzymania glikemii</string>
|
||||
<string name="cwf_comment_sgv">Wartość glikemii</string>
|
||||
<string name="cwf_comment_cover_plate">Obraz nakładki przed tekstem (tarcze...)</string>
|
||||
<string name="cwf_comment_hour_hand">Obraz lub wskazówka godzinowa (Tarcza Analogowa)</string>
|
||||
<string name="cwf_comment_minute_hand">Obraz lub wskazówka minutowa (Tarcza Analogowa)</string>
|
||||
<string name="cwf_comment_second_hand">Obraz lub wskazówka sekundowa (Tarcza Analogowa)</string>
|
||||
</resources>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -1,38 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- DateUtil-->
|
||||
<string name="minago">%1$d мин. назад</string>
|
||||
<string name="minago_long">%1$d минут назад</string>
|
||||
<string name="hoursago">%1$.1fч. назад</string>
|
||||
<string name="days_ago">%1$s дн назад</string>
|
||||
<string name="days_ago_round">%1$s дн назад</string>
|
||||
<string name="in_days">через %1$.0f дн</string>
|
||||
<string name="in_days_round">через %1$.0f дн</string>
|
||||
<string name="shorthour">ч</string>
|
||||
<string name="days">дн</string>
|
||||
<string name="hours">час</string>
|
||||
<string name="unit_second">сек</string>
|
||||
<string name="unit_minute">мин</string>
|
||||
<string name="unit_hour">час</string>
|
||||
<string name="unit_day">дн</string>
|
||||
<string name="unit_week">нед</string>
|
||||
<string name="unit_seconds">сек</string>
|
||||
<string name="unit_minutes">мин</string>
|
||||
<string name="unit_hours">час</string>
|
||||
<string name="unit_days">дн</string>
|
||||
<string name="unit_weeks">нед</string>
|
||||
<string name="shortminute">м</string>
|
||||
<string name="shortday">д</string>
|
||||
<string name="later_today">Позднее сегодня</string>
|
||||
<string name="tomorrow">Завтра</string>
|
||||
<string name="today">Cегодня</string>
|
||||
<string name="yesterday">Вчера</string>
|
||||
<!-- Rx -->
|
||||
<string name="connecting_for">Связь установлена за %1$d сек</string>
|
||||
<string name="handshaking">Подтверждение связи</string>
|
||||
<string name="connected">соединение установлено</string>
|
||||
<string name="disconnecting">разъединение</string>
|
||||
<string name="waiting_for_disconnection">Ожидание разъединения</string>
|
||||
<!-- Custom Watchface -->
|
||||
<string name="pref_show_delta">Отображать дельту</string>
|
||||
</resources>
|
|
@ -1,93 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- DateUtil-->
|
||||
<string name="minago">pred %1$d min</string>
|
||||
<string name="minago_long">pred %1$d minútami</string>
|
||||
<string name="hoursago">pred %1$.1f h</string>
|
||||
<string name="days_ago">Pred %1$.1f dňami</string>
|
||||
<string name="days_ago_round">Pred %1$.0f dňami</string>
|
||||
<string name="in_days">za %1$.0f dní</string>
|
||||
<string name="in_days_round">za %1$.0f dní</string>
|
||||
<string name="shorthour">h</string>
|
||||
<string name="days">dní</string>
|
||||
<string name="hours">hodín</string>
|
||||
<string name="unit_second">sekunda</string>
|
||||
<string name="unit_minute">minúta</string>
|
||||
<string name="unit_hour">hodina</string>
|
||||
<string name="unit_day">deň</string>
|
||||
<string name="unit_week">týždeň</string>
|
||||
<string name="unit_seconds">sekúnd</string>
|
||||
<string name="unit_minutes">minút</string>
|
||||
<string name="unit_hours">hodín</string>
|
||||
<string name="unit_days">dní</string>
|
||||
<string name="unit_weeks">týždňov</string>
|
||||
<string name="shortminute">m</string>
|
||||
<string name="shortday">d</string>
|
||||
<string name="later_today">Neskôr počas dňa</string>
|
||||
<string name="tomorrow">Zajtra</string>
|
||||
<string name="today">Dnes</string>
|
||||
<string name="yesterday">včera</string>
|
||||
<!-- Rx -->
|
||||
<string name="connecting_for">Pripájanie %1$d sek</string>
|
||||
<string name="handshaking">Overovanie</string>
|
||||
<string name="connected">Pripojené</string>
|
||||
<string name="disconnecting">Odpájanie</string>
|
||||
<string name="waiting_for_disconnection">Čakám na odpojenie</string>
|
||||
<!-- Custom Watchface -->
|
||||
<string name="metadata_label_watchface_created_at">Vytvorené: %1$s</string>
|
||||
<string name="metadata_label_watchface_author">Autor: %1$s</string>
|
||||
<string name="metadata_label_watchface_name">Meno: %1$s</string>
|
||||
<string name="metadata_wear_import_filename">Názov súboru: %1$s</string>
|
||||
<string name="metadata_label_plugin_version">Verzia pluginu: %1$s</string>
|
||||
<string name="metadata_label_watchface_name_version">Meno: %1$s (%2$s)</string>
|
||||
<string name="metadata_label_watchface_infos">Informácie: %1$s</string>
|
||||
<string name="pref_show_iob">Zobraziť IOB</string>
|
||||
<string name="pref_show_detailed_iob">Zobraziť detailný IOB</string>
|
||||
<string name="pref_show_cob">Zobraziť COB</string>
|
||||
<string name="pref_show_delta">Zobraziť odchýlku</string>
|
||||
<string name="pref_show_detailed_delta">Zobraziť detailnú odchylku</string>
|
||||
<string name="pref_show_avgdelta">Zobraziť priemernú odchýlku</string>
|
||||
<string name="pref_show_phone_battery">Zobraziť stav batérie telefónu</string>
|
||||
<string name="pref_show_rig_battery">Zobrazovať stav batérie ďalších zariadení</string>
|
||||
<string name="pref_show_basal_rate">Zobraziť bazál</string>
|
||||
<string name="pref_show_loop_status">Zobraziť stav uzavretého okruhu</string>
|
||||
<string name="pref_show_bg">Zobraziť glykémiu</string>
|
||||
<string name="pref_show_bgi">Zobraziť BGI</string>
|
||||
<string name="pref_show_direction_arrow">Zobraziť trendovú šípku</string>
|
||||
<string name="pref_show_ago">Zobraziť aktualizované pred</string>
|
||||
<string name="default_custom_watchface_comment">Predvolený ciferník. Môžete kliknúť na tlačítko EXPORTOVAŤ CIFERNÍK pre vygenerovanie šablóny</string>
|
||||
<string name="wear_default_watchface">Predvolený ciferník</string>
|
||||
<string name="cwf_comment_background">Obrázok pozadia</string>
|
||||
<string name="cwf_comment_chart">Grafy (glykémie, bazály, krivky predpovedí...)</string>
|
||||
<string name="cwf_comment_cover_chart">Obrázok pred grafom a za textovými poliami</string>
|
||||
<string name="cwf_comment_freetext1">Voľný text 1</string>
|
||||
<string name="cwf_comment_freetext2">Voľný text 2</string>
|
||||
<string name="cwf_comment_freetext3">Voľný text 3</string>
|
||||
<string name="cwf_comment_freetext4">Voľný text 4</string>
|
||||
<string name="cwf_comment_iob1">Štítok IOB alebo suma IOB pri zapnutých detailoch</string>
|
||||
<string name="cwf_comment_iob2">Suma IOB alebo (Bolus_IOB|Basal_IOB) pri zapnutých detailoch</string>
|
||||
<string name="cwf_comment_cob1">Štítok COB</string>
|
||||
<string name="cwf_comment_cob2">Hodnota COB</string>
|
||||
<string name="cwf_comment_delta">Krátkodobý priemer</string>
|
||||
<string name="cwf_comment_avg_delta">Priemerný rozdiel glykémií (15min)</string>
|
||||
<string name="cwf_comment_uploader_battery">Batéria telefónu (%)</string>
|
||||
<string name="cwf_comment_rig_battery">Batéria uzavretého okruhu (%)</string>
|
||||
<string name="cwf_comment_basalRate">Bazálna dávka</string>
|
||||
<string name="cwf_comment_bgi">Hodnota BGI</string>
|
||||
<string name="cwf_comment_time">Čas (HH:MM alebo HH:MM:SS)</string>
|
||||
<string name="cwf_comment_hour">Hodiny (HH)</string>
|
||||
<string name="cwf_comment_minute">Minúty (MM)</string>
|
||||
<string name="cwf_comment_second">Sekundy (SS)</string>
|
||||
<string name="cwf_comment_timePeriod">AM alebo PM</string>
|
||||
<string name="cwf_comment_day_name">Meno dňa v týždni</string>
|
||||
<string name="cwf_comment_day">Deň (DD)</string>
|
||||
<string name="cwf_comment_month">Názov mesiaca (krátky)</string>
|
||||
<string name="cwf_comment_loop">Stav uzavretého okruhu a čas</string>
|
||||
<string name="cwf_comment_direction">Trendová šípka</string>
|
||||
<string name="cwf_comment_timestamp">Pred minútami pre poslednú prijatú glykémiu</string>
|
||||
<string name="cwf_comment_sgv">Hodnota glykémie</string>
|
||||
<string name="cwf_comment_cover_plate">Úvodný obrázok pred textom (číselníky...)</string>
|
||||
<string name="cwf_comment_hour_hand">Obrázok hodinovej ručičky (Analógové hodinky)</string>
|
||||
<string name="cwf_comment_minute_hand">Obrázok minútovej ručičky (Analógové hodinky)</string>
|
||||
<string name="cwf_comment_second_hand">Obrázok sekundovej ručičky (Analógové hodinky)</string>
|
||||
</resources>
|
|
@ -1,6 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- DateUtil-->
|
||||
<!-- Rx -->
|
||||
<!-- Custom Watchface -->
|
||||
</resources>
|
|
@ -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>
|
|
@ -1,93 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- DateUtil-->
|
||||
<string name="minago">%1$d dak önce</string>
|
||||
<string name="minago_long">%1$d dakika önce</string>
|
||||
<string name="hoursago">%1$.1f s önce</string>
|
||||
<string name="days_ago">%1$.1f gün önce</string>
|
||||
<string name="days_ago_round">%1$.0f gün önce</string>
|
||||
<string name="in_days">%1$.0f gün içinde</string>
|
||||
<string name="in_days_round">%1$.0f gün içinde</string>
|
||||
<string name="shorthour">s</string>
|
||||
<string name="days">gün</string>
|
||||
<string name="hours">saat</string>
|
||||
<string name="unit_second">saniye</string>
|
||||
<string name="unit_minute">dakika</string>
|
||||
<string name="unit_hour">saat</string>
|
||||
<string name="unit_day">gün</string>
|
||||
<string name="unit_week">hafta</string>
|
||||
<string name="unit_seconds">saniye</string>
|
||||
<string name="unit_minutes">dakika</string>
|
||||
<string name="unit_hours">saat</string>
|
||||
<string name="unit_days">gün</string>
|
||||
<string name="unit_weeks">hafta</string>
|
||||
<string name="shortminute">d</string>
|
||||
<string name="shortday">g</string>
|
||||
<string name="later_today">Bugünden sonra</string>
|
||||
<string name="tomorrow">Yarın</string>
|
||||
<string name="today">Bugün</string>
|
||||
<string name="yesterday">Dün</string>
|
||||
<!-- Rx -->
|
||||
<string name="connecting_for">%1$d bağlanıyor</string>
|
||||
<string name="handshaking">Bağlandı</string>
|
||||
<string name="connected">Bağlandı</string>
|
||||
<string name="disconnecting">Bağlantı kesiliyor</string>
|
||||
<string name="waiting_for_disconnection">Bağlantının kesilmesi bekleniyor</string>
|
||||
<!-- Custom Watchface -->
|
||||
<string name="metadata_label_watchface_created_at">Oluşturuldu: %1$s</string>
|
||||
<string name="metadata_label_watchface_author">Yetki: %1$s</string>
|
||||
<string name="metadata_label_watchface_name">İsim: %1$s</string>
|
||||
<string name="metadata_wear_import_filename">Dosya adı: %1$s</string>
|
||||
<string name="metadata_label_plugin_version">Eklenti sürümü: %1$s</string>
|
||||
<string name="metadata_label_watchface_name_version">İsim: %1$s (%2$s)</string>
|
||||
<string name="metadata_label_watchface_infos">Bilgi: %1$s</string>
|
||||
<string name="pref_show_iob">AİNS Göster</string>
|
||||
<string name="pref_show_detailed_iob">Detalı AİNS göster</string>
|
||||
<string name="pref_show_cob">AKRB göster</string>
|
||||
<string name="pref_show_delta">Deltayı göster</string>
|
||||
<string name="pref_show_detailed_delta">Detaylı Delta göster</string>
|
||||
<string name="pref_show_avgdelta">OrtDelta\'yı Göster</string>
|
||||
<string name="pref_show_phone_battery">Telefon Pilini Göster</string>
|
||||
<string name="pref_show_rig_battery">Teçhizat Pilini Göster</string>
|
||||
<string name="pref_show_basal_rate">Bazal Oranı Göster</string>
|
||||
<string name="pref_show_loop_status">Döngü Durumunu Göster</string>
|
||||
<string name="pref_show_bg">KŞ\'ni göster</string>
|
||||
<string name="pref_show_bgi">KŞ Etkisi Göster</string>
|
||||
<string name="pref_show_direction_arrow">Yön Oku Göster</string>
|
||||
<string name="pref_show_ago">Önce Göster</string>
|
||||
<string name="default_custom_watchface_comment">Varsayılan saat arayüzü; bir şablon oluşturmak için SAAT ARAYÜZÜNÜ DIŞA AKTAR butonuna tıklayabilirsiniz</string>
|
||||
<string name="wear_default_watchface">Varsayılan saat arayüzü</string>
|
||||
<string name="cwf_comment_background">Arka plan görüntüsü</string>
|
||||
<string name="cwf_comment_chart">Grafik (KŞ, bazal, tahmin çizgileri...)</string>
|
||||
<string name="cwf_comment_cover_chart">Grafiğin önündeki ve metin alanlarının arkasındaki resim</string>
|
||||
<string name="cwf_comment_freetext1">Serbest metin 1</string>
|
||||
<string name="cwf_comment_freetext2">Serbest metin 2</string>
|
||||
<string name="cwf_comment_freetext3">Serbest metin 3</string>
|
||||
<string name="cwf_comment_freetext4">Serbest metin 4</string>
|
||||
<string name="cwf_comment_iob1">Ayrıntılıysa AİNS etiketi veya AİNS Toplamı</string>
|
||||
<string name="cwf_comment_iob2">AİNS Toplamı veya ayrıntılıysa (Bolus_AİNS|Basal_AİNS)</string>
|
||||
<string name="cwf_comment_cob1">AKRB etiketi</string>
|
||||
<string name="cwf_comment_cob2">AKRB değeri</string>
|
||||
<string name="cwf_comment_delta">Kısa KŞ delta</string>
|
||||
<string name="cwf_comment_avg_delta">Ortalama KŞ delta (15dk)</string>
|
||||
<string name="cwf_comment_uploader_battery">Telefon pili (%)</string>
|
||||
<string name="cwf_comment_rig_battery">Global döngü pili (%)</string>
|
||||
<string name="cwf_comment_basalRate">Bazal Oranı</string>
|
||||
<string name="cwf_comment_bgi">KŞ etkisi değeri</string>
|
||||
<string name="cwf_comment_time">Saat (SS:DD veya SS:DD:SS)</string>
|
||||
<string name="cwf_comment_hour">Saat (SS)</string>
|
||||
<string name="cwf_comment_minute">Dakika (DD)</string>
|
||||
<string name="cwf_comment_second">Saniye (SS)</string>
|
||||
<string name="cwf_comment_timePeriod">AM veya PM</string>
|
||||
<string name="cwf_comment_day_name">Haftanın gününün adı</string>
|
||||
<string name="cwf_comment_day">Gün (GG)</string>
|
||||
<string name="cwf_comment_month">Ay adı (kısa)</string>
|
||||
<string name="cwf_comment_loop">Döngü durumu ve öncesi</string>
|
||||
<string name="cwf_comment_direction">Yön Okları</string>
|
||||
<string name="cwf_comment_timestamp">Birkaç dakika önce son alınan KŞ</string>
|
||||
<string name="cwf_comment_sgv">KŞ değeri</string>
|
||||
<string name="cwf_comment_cover_plate">Metnin önündeki kapak resmi (kadranlar...)</string>
|
||||
<string name="cwf_comment_hour_hand">Akrep şekli (Analog Saat)</string>
|
||||
<string name="cwf_comment_minute_hand">Yelkovan şekli (Analog Saat)</string>
|
||||
<string name="cwf_comment_second_hand">Saniye şekli (Analog Saat)</string>
|
||||
</resources>
|
|
@ -1,6 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- DateUtil-->
|
||||
<!-- Rx -->
|
||||
<!-- Custom Watchface -->
|
||||
</resources>
|
|
@ -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>
|
|
@ -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>
|
|
@ -1,197 +0,0 @@
|
|||
package info.nightscout.rx.weardata
|
||||
|
||||
import kotlinx.serialization.ExperimentalSerializationApi
|
||||
import org.junit.jupiter.api.Assertions
|
||||
import org.junit.jupiter.api.BeforeEach
|
||||
import org.junit.jupiter.api.Test
|
||||
import org.junit.jupiter.api.extension.ExtendWith
|
||||
import org.mockito.junit.jupiter.MockitoExtension
|
||||
import org.mockito.junit.jupiter.MockitoSettings
|
||||
import org.mockito.quality.Strictness
|
||||
|
||||
@ExperimentalSerializationApi
|
||||
@ExtendWith(MockitoExtension::class)
|
||||
@MockitoSettings(strictness = Strictness.LENIENT)
|
||||
class EventDataTest {
|
||||
|
||||
@BeforeEach
|
||||
fun setUp() {
|
||||
}
|
||||
|
||||
@Test
|
||||
fun serializationTest() {
|
||||
EventData.ActionPong(1, 2).let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.WearException(1, byteArrayOf(0xAA.toByte()), "board", "fingerprint", "sdk", "model", "manufacturer", "product").let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.Error(1).let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.CancelBolus(1).let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.ActionResendData("data").let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.ActionPumpStatus(1).let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.ActionLoopStatus(1).let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.ActionTddStatus(1).let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.ActionECarbsPreCheck(1, 2, 3).let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.ActionBolusPreCheck(1.0, 2).let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.ActionFillPreCheck(1.0).let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.ActionFillPresetPreCheck(1).let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.ActionProfileSwitchSendInitialData(1).let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.ActionProfileSwitchPreCheck(1, 2).let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.ActionWizardPreCheck(1, 2).let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.ActionQuickWizardPreCheck("guid").let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.ActionHeartRate(1, 2, 3.0, "device").let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.ActionTempTargetPreCheck(EventData.ActionTempTargetPreCheck.TempTargetCommand.CANCEL).let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.ActionWizardConfirmed(1).let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.ActionTempTargetConfirmed(false).let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.ActionBolusConfirmed(1.0, 2).let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.ActionECarbsConfirmed(1, 2, 3).let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.ActionFillConfirmed(1.0).let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.ActionProfileSwitchConfirmed(1, 2).let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.OpenLoopRequestConfirmed(1).let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.CancelNotification(1).let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
// EventData.ActionGetCustomWatchface(EventData.ActionSetCustomWatchface(CwfData())).let {
|
||||
// Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
// Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
// }
|
||||
EventData.ActionPing(1).let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.OpenSettings(1).let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.BolusProgress(1, "status").let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.SingleBg(1, sgv = 2.0, high = 3.0, low = 4.0).let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.GraphData(arrayListOf(EventData.SingleBg(1, sgv = 2.0, high = 3.0, low = 4.0))).let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.TreatmentData(
|
||||
arrayListOf(EventData.TreatmentData.TempBasal(1, 2.0, 3, 4.0, 5.0)),
|
||||
arrayListOf(EventData.TreatmentData.Basal(1, 2, 3.0)),
|
||||
arrayListOf(EventData.TreatmentData.Treatment(1, 2.0, 3.0, true, isValid = true)),
|
||||
arrayListOf(EventData.SingleBg(1, sgv = 2.0, high = 3.0, low = 4.0))
|
||||
).let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.Preferences(1, wearControl = true, true, 2, 3, 4.0, 5.0, 6.0, 7, 8).let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.QuickWizard(arrayListOf(EventData.QuickWizard.QuickWizardEntry("1", "2", 3, 4, 5))).let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
// EventData.ActionSetCustomWatchface().let {
|
||||
// Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
// Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
// }
|
||||
EventData.ActionrequestCustomWatchface(true).let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.ActionrequestSetDefaultWatchface(1).let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.ActionProfileSwitchOpenActivity(1, 2).let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.OpenLoopRequest("1", "2", null).let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.ConfirmAction("1", "2", null).let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
EventData.SnoozeAlert(1).let {
|
||||
Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte()))
|
||||
Assertions.assertEquals(it, EventData.deserialize(it.serialize()))
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,112 +0,0 @@
|
|||
package info.nightscout.shared
|
||||
|
||||
import org.junit.jupiter.api.Assertions
|
||||
import org.junit.jupiter.api.Test
|
||||
|
||||
@Suppress("SpellCheckingInspection")
|
||||
class SafeParseTest {
|
||||
|
||||
@Test fun stringToDoubleTest() {
|
||||
// correct values
|
||||
Assertions.assertEquals(0.1234, SafeParse.stringToDouble("0.1234"), 0.001)
|
||||
Assertions.assertEquals(0.1234, SafeParse.stringToDouble("0,1234"), 0.001)
|
||||
Assertions.assertEquals(0.5436564812, SafeParse.stringToDouble(".5436564812"), 0.001)
|
||||
Assertions.assertEquals(0.5436564812, SafeParse.stringToDouble(",5436564812"), 0.001)
|
||||
Assertions.assertEquals(1000500100900.0, SafeParse.stringToDouble("1000500100900"), 0.001)
|
||||
Assertions.assertEquals(42.0, SafeParse.stringToDouble("42"), 0.001)
|
||||
|
||||
// units or other extra values are not permitted
|
||||
Assertions.assertEquals(0.0, SafeParse.stringToDouble("12 U/h"), 0.001)
|
||||
|
||||
// strings are not parsable
|
||||
Assertions.assertEquals(0.0, SafeParse.stringToDouble("ala ma kota"), 0.001)
|
||||
|
||||
// separator errors
|
||||
Assertions.assertEquals(0.0, SafeParse.stringToDouble("0.1234.5678"), 0.001)
|
||||
Assertions.assertEquals(0.0, SafeParse.stringToDouble("0,1234,5678"), 0.001)
|
||||
|
||||
// various emptiness
|
||||
Assertions.assertEquals(0.0, SafeParse.stringToDouble(""), 0.001)
|
||||
Assertions.assertEquals(0.0, SafeParse.stringToDouble(" "), 0.001)
|
||||
Assertions.assertEquals(0.0, SafeParse.stringToDouble("\n\r"), 0.001)
|
||||
}
|
||||
|
||||
@Test fun stringToIntTest() {
|
||||
// correct values
|
||||
Assertions.assertEquals(1052934, SafeParse.stringToInt("1052934"))
|
||||
Assertions.assertEquals(-42, SafeParse.stringToInt("-42"))
|
||||
Assertions.assertEquals(2147483647, SafeParse.stringToInt("2147483647"))
|
||||
Assertions.assertEquals(-2147483648, SafeParse.stringToInt("-2147483648"))
|
||||
|
||||
// outside Integer range
|
||||
Assertions.assertEquals(0, SafeParse.stringToInt("2147483648"))
|
||||
Assertions.assertEquals(0, SafeParse.stringToInt("-2147483649"))
|
||||
|
||||
// units or other extra values are not permitted
|
||||
Assertions.assertEquals(0, SafeParse.stringToInt("12 U/h"))
|
||||
Assertions.assertEquals(0, SafeParse.stringToInt("0.1234"))
|
||||
Assertions.assertEquals(0, SafeParse.stringToInt("0,1234"))
|
||||
Assertions.assertEquals(0, SafeParse.stringToInt(".5436564812"))
|
||||
Assertions.assertEquals(0, SafeParse.stringToInt(",5436564812"))
|
||||
Assertions.assertEquals(0, SafeParse.stringToInt("42.1234"))
|
||||
Assertions.assertEquals(0, SafeParse.stringToInt("42,1234"))
|
||||
Assertions.assertEquals(0, SafeParse.stringToInt("3212.5436564812"))
|
||||
Assertions.assertEquals(0, SafeParse.stringToInt("3212,5436564812"))
|
||||
Assertions.assertEquals(0, SafeParse.stringToInt("1000500100900"))
|
||||
|
||||
// strings are not parsable
|
||||
Assertions.assertEquals(0, SafeParse.stringToInt("ala ma kota"))
|
||||
|
||||
// various emptiness
|
||||
Assertions.assertEquals(0, SafeParse.stringToInt(""))
|
||||
Assertions.assertEquals(0, SafeParse.stringToInt(" "))
|
||||
Assertions.assertEquals(0, SafeParse.stringToInt("\n\r"))
|
||||
}
|
||||
|
||||
@Test fun stringToLongTest() {
|
||||
// correct values
|
||||
Assertions.assertEquals(1052934L, SafeParse.stringToLong("1052934"))
|
||||
Assertions.assertEquals(-42L, SafeParse.stringToLong("-42"))
|
||||
Assertions.assertEquals(2147483647L, SafeParse.stringToLong("2147483647"))
|
||||
Assertions.assertEquals(-2147483648L, SafeParse.stringToLong("-2147483648"))
|
||||
Assertions.assertEquals(1000500100900L, SafeParse.stringToLong("1000500100900"))
|
||||
|
||||
// outside Integer range
|
||||
Assertions.assertEquals(2147483648L, SafeParse.stringToLong("2147483648"))
|
||||
Assertions.assertEquals(-2147483649L, SafeParse.stringToLong("-2147483649"))
|
||||
|
||||
// units or other extra values are not permitted
|
||||
Assertions.assertEquals(0L, SafeParse.stringToLong("12 U/h"))
|
||||
Assertions.assertEquals(0L, SafeParse.stringToLong("0.1234"))
|
||||
Assertions.assertEquals(0L, SafeParse.stringToLong("0,1234"))
|
||||
Assertions.assertEquals(0L, SafeParse.stringToLong(".5436564812"))
|
||||
Assertions.assertEquals(0L, SafeParse.stringToLong(",5436564812"))
|
||||
Assertions.assertEquals(0L, SafeParse.stringToLong("42.1234"))
|
||||
Assertions.assertEquals(0L, SafeParse.stringToLong("42,1234"))
|
||||
Assertions.assertEquals(0L, SafeParse.stringToLong("3212.5436564812"))
|
||||
Assertions.assertEquals(0L, SafeParse.stringToLong("3212,5436564812"))
|
||||
|
||||
// strings are not parsable
|
||||
Assertions.assertEquals(0L, SafeParse.stringToLong("ala ma kota"))
|
||||
|
||||
// various emptiness
|
||||
Assertions.assertEquals(0L, SafeParse.stringToLong(""))
|
||||
Assertions.assertEquals(0L, SafeParse.stringToLong(" "))
|
||||
Assertions.assertEquals(0L, SafeParse.stringToLong("\n\r"))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun stringToDoubleNullTest() {
|
||||
Assertions.assertEquals(0.0, SafeParse.stringToDouble(null), 0.001)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun stringToIntNullTest() {
|
||||
Assertions.assertEquals(0, SafeParse.stringToInt(null))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun stringToLongNullTest() {
|
||||
Assertions.assertEquals(0L, SafeParse.stringToLong(null))
|
||||
}
|
||||
}
|
|
@ -181,7 +181,6 @@ dependencies {
|
|||
// in order to use internet's versions you'd need to enable Jetifier again
|
||||
// https://github.com/nightscout/graphview.git
|
||||
// https://github.com/nightscout/iconify.git
|
||||
implementation project(':app-wear-shared:shared')
|
||||
implementation project(':app-wear-shared:shared-impl')
|
||||
implementation project(':core:main')
|
||||
implementation project(':core:graphview')
|
||||
|
@ -216,7 +215,6 @@ dependencies {
|
|||
implementation project(':insight')
|
||||
implementation project(':pump:medtronic')
|
||||
implementation project(':pump:pump-common')
|
||||
implementation project(':pump:pump-core')
|
||||
implementation project(':pump:omnipod-common')
|
||||
implementation project(':pump:omnipod-eros')
|
||||
implementation project(':pump:omnipod-dash')
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
*/
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -1,2 +0,0 @@
|
|||
package info.nightscout.androidaps.di
|
||||
|
|
@ -10,7 +10,6 @@ import androidx.work.WorkQuery
|
|||
import androidx.work.WorkerParameters
|
||||
import androidx.work.workDataOf
|
||||
import com.google.common.util.concurrent.ListenableFuture
|
||||
import info.nightscout.androidaps.BuildConfig
|
||||
import info.nightscout.androidaps.R
|
||||
import info.nightscout.configuration.maintenance.MaintenancePlugin
|
||||
import info.nightscout.core.profile.ProfileSealed
|
||||
|
@ -19,13 +18,11 @@ import info.nightscout.database.impl.AppRepository
|
|||
import info.nightscout.interfaces.Config
|
||||
import info.nightscout.interfaces.LocalAlertUtils
|
||||
import info.nightscout.interfaces.aps.Loop
|
||||
import info.nightscout.interfaces.configBuilder.RunningConfiguration
|
||||
import info.nightscout.interfaces.iob.IobCobCalculator
|
||||
import info.nightscout.interfaces.plugin.ActivePlugin
|
||||
import info.nightscout.interfaces.profile.ProfileFunction
|
||||
import info.nightscout.interfaces.queue.Command
|
||||
import info.nightscout.interfaces.queue.CommandQueue
|
||||
import info.nightscout.interfaces.receivers.ReceiverStatusStore
|
||||
import info.nightscout.rx.bus.RxBus
|
||||
import info.nightscout.rx.events.EventProfileSwitchChanged
|
||||
import info.nightscout.rx.logging.LTag
|
||||
|
@ -51,8 +48,6 @@ class KeepAliveWorker(
|
|||
@Inject lateinit var dateUtil: DateUtil
|
||||
@Inject lateinit var activePlugin: ActivePlugin
|
||||
@Inject lateinit var profileFunction: ProfileFunction
|
||||
@Inject lateinit var runningConfiguration: RunningConfiguration
|
||||
@Inject lateinit var receiverStatusStore: ReceiverStatusStore
|
||||
@Inject lateinit var rxBus: RxBus
|
||||
@Inject lateinit var commandQueue: CommandQueue
|
||||
@Inject lateinit var maintenancePlugin: MaintenancePlugin
|
||||
|
@ -155,13 +150,7 @@ class KeepAliveWorker(
|
|||
else if (dateUtil.isOlderThan(activePlugin.activeAPS.lastAPSRun, 5)) shouldUploadStatus = true
|
||||
if (dateUtil.isOlderThan(lastIobUpload, IOB_UPDATE_FREQUENCY_IN_MINUTES) && shouldUploadStatus) {
|
||||
lastIobUpload = dateUtil.now()
|
||||
loop.buildDeviceStatus(
|
||||
dateUtil, loop, iobCobCalculator, profileFunction,
|
||||
activePlugin.activePump, receiverStatusStore, runningConfiguration,
|
||||
BuildConfig.VERSION_NAME + "-" + BuildConfig.BUILDVERSION
|
||||
)?.also {
|
||||
repository.insert(it)
|
||||
}
|
||||
loop.buildAndStoreDeviceStatus()
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -193,8 +182,8 @@ class KeepAliveWorker(
|
|||
// do nothing if pump is disconnected
|
||||
} else if (runningProfile == null || ((!pump.isThisProfileSet(requestedProfile) || !requestedProfile.isEqual(runningProfile)
|
||||
|| (runningProfile is ProfileSealed.EPS && runningProfile.value.originalEnd < dateUtil.now() && runningProfile.value.originalDuration != 0L))
|
||||
&& !commandQueue.isRunning(Command.CommandType.BASAL_PROFILE)))
|
||||
{
|
||||
&& !commandQueue.isRunning(Command.CommandType.BASAL_PROFILE))
|
||||
) {
|
||||
rxBus.send(EventProfileSwitchChanged())
|
||||
} else if (isStatusOutdated && !pump.isBusy()) {
|
||||
lastReadStatus = now
|
||||
|
|
|
@ -121,12 +121,12 @@ class CalculationWorkflowImpl @Inject constructor(
|
|||
}
|
||||
|
||||
override fun stopCalculation(job: String, from: String) {
|
||||
aapsLogger.debug(LTag.AUTOSENS, "Stopping calculation thread: $from")
|
||||
aapsLogger.debug(LTag.WORKER, "Stopping calculation thread: $from")
|
||||
WorkManager.getInstance(context).cancelUniqueWork(job)
|
||||
val workStatus = WorkManager.getInstance(context).getWorkInfosForUniqueWork(job).get()
|
||||
while (workStatus.size >= 1 && workStatus[0].state == WorkInfo.State.RUNNING)
|
||||
SystemClock.sleep(100)
|
||||
aapsLogger.debug(LTag.AUTOSENS, "Calculation thread stopped: $from")
|
||||
aapsLogger.debug(LTag.WORKER, "Calculation thread stopped: $from")
|
||||
}
|
||||
|
||||
override fun runCalculation(
|
||||
|
@ -138,7 +138,7 @@ class CalculationWorkflowImpl @Inject constructor(
|
|||
bgDataReload: Boolean,
|
||||
cause: Event?
|
||||
) {
|
||||
aapsLogger.debug(LTag.AUTOSENS, "Starting calculation worker: $reason to ${dateUtil.dateAndTimeAndSecondsString(end)}")
|
||||
aapsLogger.debug(LTag.WORKER, "Starting calculation worker: $reason to ${dateUtil.dateAndTimeAndSecondsString(end)}")
|
||||
|
||||
WorkManager.getInstance(context)
|
||||
.beginUniqueWork(
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
<string name="save">Сохранить</string>
|
||||
<string name="reloadprofile">обновить профиль</string>
|
||||
<string name="correctionbous">Коррекция</string>
|
||||
<string name="ns_upload_only">(ОТКЛЮЧЕНИЕ ОПАСНО) Только загрузка в NS</string>
|
||||
<string name="ns_upload_only_summary">Только загрузка в NS (синхронизация отключена). Не влияет на данные мониторинга если не выбран локальный источник, такой как xDrip. Профили, иные чем профиль NS не действуют.\n!!! ПРЕДУПРЕЖДЕНИЕ !!! Отключение этой опции может привести к сбою и передозировке инсулина, если какой-либо из компонентов (AAPS, NS, xDrip) настроен неправильно. Внимательно следите за тем, чтобы данные соответствовали состоянию помпы!</string>
|
||||
<string name="wear">Смарт-часы Wear</string>
|
||||
<string name="nav_about">о приложении</string>
|
||||
|
|
|
@ -2,14 +2,14 @@ package info.nightscout.plugins.aps.loop
|
|||
|
||||
import android.app.NotificationManager
|
||||
import android.content.Context
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import dagger.android.AndroidInjector
|
||||
import dagger.android.HasAndroidInjector
|
||||
import info.nightscout.core.utils.fabric.FabricPrivacy
|
||||
import info.nightscout.database.impl.AppRepository
|
||||
import info.nightscout.interfaces.ApsMode
|
||||
import info.nightscout.interfaces.Config
|
||||
import info.nightscout.interfaces.configBuilder.RunningConfiguration
|
||||
import info.nightscout.interfaces.constraints.Constraints
|
||||
import info.nightscout.interfaces.constraints.ConstraintsChecker
|
||||
import info.nightscout.interfaces.iob.IobCobCalculator
|
||||
import info.nightscout.interfaces.logging.UserEntryLogger
|
||||
import info.nightscout.interfaces.plugin.ActivePlugin
|
||||
|
@ -20,12 +20,11 @@ import info.nightscout.interfaces.queue.CommandQueue
|
|||
import info.nightscout.interfaces.receivers.ReceiverStatusStore
|
||||
import info.nightscout.interfaces.ui.UiInteraction
|
||||
import info.nightscout.pump.virtual.VirtualPumpPlugin
|
||||
import info.nightscout.rx.bus.RxBus
|
||||
import info.nightscout.sdk.interfaces.RunningConfiguration
|
||||
import info.nightscout.shared.interfaces.ResourceHelper
|
||||
import info.nightscout.shared.sharedPreferences.SP
|
||||
import info.nightscout.shared.utils.DateUtil
|
||||
import info.nightscout.sharedtests.TestBase
|
||||
import org.junit.jupiter.api.Assertions
|
||||
import org.junit.jupiter.api.BeforeEach
|
||||
import org.junit.jupiter.api.Test
|
||||
import org.mockito.Mock
|
||||
|
@ -34,8 +33,7 @@ import org.mockito.Mockito.`when`
|
|||
class LoopPluginTest : TestBase() {
|
||||
|
||||
@Mock lateinit var sp: SP
|
||||
private val rxBus: RxBus = RxBus(aapsSchedulers, aapsLogger)
|
||||
@Mock lateinit var constraintChecker: Constraints
|
||||
@Mock lateinit var constraintChecker: ConstraintsChecker
|
||||
@Mock lateinit var rh: ResourceHelper
|
||||
@Mock lateinit var profileFunction: ProfileFunction
|
||||
@Mock lateinit var context: Context
|
||||
|
@ -74,28 +72,28 @@ class LoopPluginTest : TestBase() {
|
|||
`when`(sp.getString(info.nightscout.core.utils.R.string.key_aps_mode, ApsMode.OPEN.name)).thenReturn(ApsMode.CLOSED.name)
|
||||
val pumpDescription = PumpDescription()
|
||||
`when`(virtualPumpPlugin.pumpDescription).thenReturn(pumpDescription)
|
||||
Assertions.assertEquals(LoopFragment::class.java.name, loopPlugin.pluginDescription.fragmentClass)
|
||||
Assertions.assertEquals(PluginType.LOOP, loopPlugin.getType())
|
||||
Assertions.assertEquals("Loop", loopPlugin.name)
|
||||
Assertions.assertEquals("LOOP", loopPlugin.nameShort)
|
||||
Assertions.assertEquals(true, loopPlugin.hasFragment())
|
||||
Assertions.assertEquals(true, loopPlugin.showInList(PluginType.LOOP))
|
||||
Assertions.assertEquals(info.nightscout.plugins.aps.R.xml.pref_loop.toLong(), loopPlugin.preferencesId.toLong())
|
||||
assertThat(loopPlugin.pluginDescription.fragmentClass).isEqualTo(LoopFragment::class.java.name)
|
||||
assertThat(loopPlugin.getType()).isEqualTo(PluginType.LOOP)
|
||||
assertThat(loopPlugin.name).isEqualTo("Loop")
|
||||
assertThat(loopPlugin.nameShort).isEqualTo("LOOP")
|
||||
assertThat(loopPlugin.hasFragment()).isTrue()
|
||||
assertThat(loopPlugin.showInList(PluginType.LOOP)).isTrue()
|
||||
assertThat(loopPlugin.preferencesId.toLong()).isEqualTo(info.nightscout.plugins.aps.R.xml.pref_loop.toLong())
|
||||
|
||||
// Plugin is disabled by default
|
||||
Assertions.assertEquals(false, loopPlugin.isEnabled())
|
||||
assertThat(loopPlugin.isEnabled()).isFalse()
|
||||
loopPlugin.setPluginEnabled(PluginType.LOOP, true)
|
||||
Assertions.assertEquals(true, loopPlugin.isEnabled())
|
||||
assertThat(loopPlugin.isEnabled()).isTrue()
|
||||
|
||||
// No temp basal capable pump should disable plugin
|
||||
virtualPumpPlugin.pumpDescription.isTempBasalCapable = false
|
||||
Assertions.assertEquals(false, loopPlugin.isEnabled())
|
||||
assertThat(loopPlugin.isEnabled()).isFalse()
|
||||
virtualPumpPlugin.pumpDescription.isTempBasalCapable = true
|
||||
|
||||
// Fragment is hidden by default
|
||||
Assertions.assertEquals(false, loopPlugin.isFragmentVisible())
|
||||
assertThat(loopPlugin.isFragmentVisible()).isFalse()
|
||||
loopPlugin.setFragmentVisible(PluginType.LOOP, true)
|
||||
Assertions.assertEquals(true, loopPlugin.isFragmentVisible())
|
||||
assertThat(loopPlugin.isFragmentVisible()).isTrue()
|
||||
}
|
||||
|
||||
/* *********** not working
|
||||
|
@ -118,7 +116,7 @@ class LoopPluginTest : TestBase() {
|
|||
MockedLoopPlugin mockedLoopPlugin = new MockedLoopPlugin();
|
||||
Treatment t = new Treatment();
|
||||
bus.post(new EventTreatmentChange(t));
|
||||
Assertions.assertEquals(true, mockedLoopPlugin.invokeCalled);
|
||||
assertThat(mockedLoopPlugin.invokeCalled).isTrue();
|
||||
}
|
||||
*/
|
||||
}
|
|
@ -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)
|
||||
}
|
||||
}
|
|
@ -14,8 +14,8 @@ import info.nightscout.implementation.iob.GlucoseStatusProviderImpl
|
|||
import info.nightscout.interfaces.ApsMode
|
||||
import info.nightscout.interfaces.bgQualityCheck.BgQualityCheck
|
||||
import info.nightscout.interfaces.constraints.Constraint
|
||||
import info.nightscout.interfaces.constraints.Constraints
|
||||
import info.nightscout.interfaces.constraints.Objectives
|
||||
import info.nightscout.interfaces.constraints.PluginConstraints
|
||||
import info.nightscout.interfaces.maintenance.PrefFileListProvider
|
||||
import info.nightscout.interfaces.plugin.PluginBase
|
||||
import info.nightscout.interfaces.plugin.PluginType
|
||||
|
@ -74,7 +74,7 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
|
|||
|
||||
private lateinit var danaPump: DanaPump
|
||||
private lateinit var insightDbHelper: InsightDbHelper
|
||||
private lateinit var constraintChecker: ConstraintsImpl
|
||||
private lateinit var constraintChecker: ConstraintsCheckerImpl
|
||||
private lateinit var safetyPlugin: SafetyPlugin
|
||||
private lateinit var objectivesPlugin: ObjectivesPlugin
|
||||
private lateinit var comboPlugin: ComboPlugin
|
||||
|
@ -134,7 +134,7 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
|
|||
`when`(sp.getString(R.string.key_danar_bt_name, "")).thenReturn("")
|
||||
|
||||
//SafetyPlugin
|
||||
constraintChecker = ConstraintsImpl(activePlugin)
|
||||
constraintChecker = ConstraintsCheckerImpl(activePlugin, aapsLogger)
|
||||
|
||||
val glucoseStatusProvider = GlucoseStatusProviderImpl(aapsLogger, iobCobCalculator, dateUtil, decimalFormatter)
|
||||
|
||||
|
@ -226,7 +226,7 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
|
|||
constraintsPluginsList.add(insightPlugin)
|
||||
constraintsPluginsList.add(openAPSAMAPlugin)
|
||||
constraintsPluginsList.add(openAPSSMBPlugin)
|
||||
`when`(activePlugin.getSpecificPluginsListByInterface(Constraints::class.java)).thenReturn(constraintsPluginsList)
|
||||
`when`(activePlugin.getSpecificPluginsListByInterface(PluginConstraints::class.java)).thenReturn(constraintsPluginsList)
|
||||
objectivesPlugin.onStart()
|
||||
}
|
||||
|
||||
|
@ -268,7 +268,7 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
|
|||
val c = constraintChecker.isAutosensModeEnabled()
|
||||
assertThat(c.reasonList).hasSize(2) // Safety & Objectives
|
||||
assertThat(c.mostLimitedReasonList).hasSize(2) // Safety & Objectives
|
||||
assertThat( c.value()).isFalse()
|
||||
assertThat(c.value()).isFalse()
|
||||
}
|
||||
|
||||
// Safety
|
||||
|
@ -278,7 +278,7 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
|
|||
val c = constraintChecker.isAdvancedFilteringEnabled()
|
||||
assertThat(c.reasonList).hasSize(1) // Safety
|
||||
assertThat(c.mostLimitedReasonList).hasSize(1) // Safety
|
||||
assertThat( c.value()).isFalse()
|
||||
assertThat(c.value()).isFalse()
|
||||
}
|
||||
|
||||
// SMB should limit
|
||||
|
@ -286,7 +286,7 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
|
|||
fun isSuperBolusEnabledTest() {
|
||||
openAPSSMBPlugin.setPluginEnabled(PluginType.APS, true)
|
||||
val c = constraintChecker.isSuperBolusEnabled()
|
||||
assertThat( c.value()).isFalse() // SMB should limit
|
||||
assertThat(c.value()).isFalse() // SMB should limit
|
||||
}
|
||||
|
||||
// Safety & Objectives
|
||||
|
@ -296,11 +296,11 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
|
|||
objectivesPlugin.objectives[Objectives.SMB_OBJECTIVE].startedOn = 0
|
||||
`when`(sp.getBoolean(info.nightscout.plugins.aps.R.string.key_use_smb, false)).thenReturn(false)
|
||||
`when`(sp.getString(info.nightscout.core.utils.R.string.key_aps_mode, ApsMode.OPEN.name)).thenReturn(ApsMode.OPEN.name)
|
||||
// `when`(constraintChecker.isClosedLoopAllowed()).thenReturn(Constraint(true))
|
||||
// `when`(constraintChecker.isClosedLoopAllowed()).thenReturn(ConstraintObject(true))
|
||||
val c = constraintChecker.isSMBModeEnabled()
|
||||
assertThat(c.reasonList).hasSize(3) // 2x Safety & Objectives
|
||||
assertThat(c.mostLimitedReasonList).hasSize(3) // 2x Safety & Objectives
|
||||
assertThat( c.value()).isFalse()
|
||||
assertThat(c.value()).isFalse()
|
||||
}
|
||||
|
||||
// applyBasalConstraints tests
|
||||
|
@ -326,9 +326,9 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
|
|||
|
||||
// Apply all limits
|
||||
val d = constraintChecker.getMaxBasalAllowed(validProfile)
|
||||
assertThat( d.value()).isWithin( 0.01).of(0.8)
|
||||
assertThat(d.value()).isWithin(0.01).of(0.8)
|
||||
assertThat(d.reasonList).hasSize(3)
|
||||
assertThat(d.getMostLimitedReasons(aapsLogger)).isEqualTo("DanaR: Limiting max basal rate to 0.80 U/h because of pump limit")
|
||||
assertThat(d.getMostLimitedReasons()).isEqualTo("DanaR: Limiting max basal rate to 0.80 U/h because of pump limit")
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -355,7 +355,7 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
|
|||
val i = constraintChecker.getMaxBasalPercentAllowed(validProfile)
|
||||
assertThat(i.value()).isEqualTo(200)
|
||||
assertThat(i.reasonList).hasSize(6)
|
||||
assertThat(i.getMostLimitedReasons(aapsLogger)).isEqualTo("Safety: Limiting max percent rate to 200% because of pump limit")
|
||||
assertThat(i.getMostLimitedReasons()).isEqualTo("Safety: Limiting max percent rate to 200% because of pump limit")
|
||||
}
|
||||
|
||||
// applyBolusConstraints tests
|
||||
|
@ -380,9 +380,9 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
|
|||
|
||||
// Apply all limits
|
||||
val d = constraintChecker.getMaxBolusAllowed()
|
||||
assertThat( d.value()).isWithin( 0.01).of(3.0)
|
||||
assertThat(d.value()).isWithin(0.01).of(3.0)
|
||||
assertThat(d.reasonList).hasSize(4) // 2x Safety & RS & R
|
||||
assertThat(d.getMostLimitedReasons(aapsLogger)).isEqualTo("Safety: Limiting bolus to 3.0 U because of max value in preferences")
|
||||
assertThat(d.getMostLimitedReasons()).isEqualTo("Safety: Limiting bolus to 3.0 U because of max value in preferences")
|
||||
}
|
||||
|
||||
// applyCarbsConstraints tests
|
||||
|
@ -395,7 +395,7 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
|
|||
val i = constraintChecker.getMaxCarbsAllowed()
|
||||
assertThat(i.value()).isEqualTo(48)
|
||||
assertThat(i.reasonList).hasSize(1)
|
||||
assertThat(i.getMostLimitedReasons(aapsLogger)).isEqualTo("Safety: Limiting carbs to 48 g because of max value in preferences")
|
||||
assertThat(i.getMostLimitedReasons()).isEqualTo("Safety: Limiting carbs to 48 g because of max value in preferences")
|
||||
}
|
||||
|
||||
// applyMaxIOBConstraints tests
|
||||
|
@ -410,9 +410,9 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
|
|||
|
||||
// Apply all limits
|
||||
val d = constraintChecker.getMaxIOBAllowed()
|
||||
assertThat( d.value()).isWithin( 0.01).of(1.5)
|
||||
assertThat(d.value()).isWithin(0.01).of(1.5)
|
||||
assertThat(d.reasonList).hasSize(2)
|
||||
assertThat(d.getMostLimitedReasons(aapsLogger)).isEqualTo("OpenAPSAMA: Limiting IOB to 1.5 U because of max value in preferences")
|
||||
assertThat(d.getMostLimitedReasons()).isEqualTo("OpenAPSAMA: Limiting IOB to 1.5 U because of max value in preferences")
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -426,8 +426,8 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
|
|||
|
||||
// Apply all limits
|
||||
val d = constraintChecker.getMaxIOBAllowed()
|
||||
assertThat( d.value()).isWithin( 0.01).of(3.0)
|
||||
assertThat(d.value()).isWithin(0.01).of(3.0)
|
||||
assertThat(d.reasonList).hasSize(2)
|
||||
assertThat(d.getMostLimitedReasons(aapsLogger)).isEqualTo("OpenAPSSMB: Limiting IOB to 3.0 U because of max value in preferences")
|
||||
assertThat(d.getMostLimitedReasons()).isEqualTo("OpenAPSSMB: Limiting IOB to 3.0 U because of max value in preferences")
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package info.nightscout.plugins.general.maintenance
|
||||
|
||||
import android.content.Context
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import dagger.android.HasAndroidInjector
|
||||
import info.nightscout.configuration.maintenance.MaintenancePlugin
|
||||
import info.nightscout.interfaces.Config
|
||||
|
@ -10,7 +11,6 @@ import info.nightscout.interfaces.nsclient.NSSettingsStatus
|
|||
import info.nightscout.shared.interfaces.ResourceHelper
|
||||
import info.nightscout.shared.sharedPreferences.SP
|
||||
import info.nightscout.sharedtests.TestBase
|
||||
import org.junit.jupiter.api.Assertions
|
||||
import org.junit.jupiter.api.BeforeEach
|
||||
import org.junit.jupiter.api.Test
|
||||
import org.mockito.Mock
|
||||
|
@ -40,11 +40,12 @@ class MaintenancePluginTest : TestBase() {
|
|||
|
||||
@Test fun logFilesTest() {
|
||||
var logs = sut.getLogFiles(2)
|
||||
Assertions.assertEquals(2, logs.size)
|
||||
Assertions.assertEquals("AndroidAPS.log", logs[0].name)
|
||||
Assertions.assertEquals("AndroidAPS.2018-01-03_01-01-00.1.zip", logs[1].name)
|
||||
assertThat(logs.map { it.name }).containsExactly(
|
||||
"AndroidAPS.log",
|
||||
"AndroidAPS.2018-01-03_01-01-00.1.zip",
|
||||
).inOrder()
|
||||
logs = sut.getLogFiles(10)
|
||||
Assertions.assertEquals(4, logs.size)
|
||||
assertThat(logs).hasSize(4)
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -53,7 +54,7 @@ class MaintenancePluginTest : TestBase() {
|
|||
val name = "AndroidAPS.log.zip"
|
||||
var zipFile = File("build/$name")
|
||||
zipFile = sut.zipLogs(zipFile, logs)
|
||||
Assertions.assertTrue(zipFile.exists())
|
||||
Assertions.assertTrue(zipFile.isFile)
|
||||
assertThat(zipFile.exists()).isTrue()
|
||||
assertThat(zipFile.isFile).isTrue()
|
||||
}
|
||||
}
|
|
@ -3,12 +3,12 @@ package info.nightscout.plugins.safety
|
|||
import com.google.common.truth.Truth.assertThat
|
||||
import dagger.android.AndroidInjector
|
||||
import dagger.android.HasAndroidInjector
|
||||
import info.nightscout.core.constraints.ConstraintObject
|
||||
import info.nightscout.database.impl.AppRepository
|
||||
import info.nightscout.interfaces.ApsMode
|
||||
import info.nightscout.interfaces.Constants
|
||||
import info.nightscout.interfaces.bgQualityCheck.BgQualityCheck
|
||||
import info.nightscout.interfaces.constraints.Constraint
|
||||
import info.nightscout.interfaces.constraints.Constraints
|
||||
import info.nightscout.interfaces.constraints.ConstraintsChecker
|
||||
import info.nightscout.interfaces.iob.GlucoseStatusProvider
|
||||
import info.nightscout.interfaces.plugin.PluginType
|
||||
import info.nightscout.interfaces.profiling.Profiler
|
||||
|
@ -29,7 +29,7 @@ import org.mockito.Mockito.`when`
|
|||
|
||||
class SafetyPluginTest : TestBaseWithProfile() {
|
||||
|
||||
@Mock lateinit var constraintChecker: Constraints
|
||||
@Mock lateinit var constraintChecker: ConstraintsChecker
|
||||
@Mock lateinit var virtualPumpPlugin: VirtualPumpPlugin
|
||||
@Mock lateinit var glimpPlugin: GlimpPlugin
|
||||
@Mock lateinit var profiler: Profiler
|
||||
|
@ -43,7 +43,10 @@ class SafetyPluginTest : TestBaseWithProfile() {
|
|||
private lateinit var openAPSAMAPlugin: OpenAPSAMAPlugin
|
||||
private lateinit var openAPSSMBPlugin: OpenAPSSMBPlugin
|
||||
|
||||
private val injector = HasAndroidInjector { AndroidInjector { } }
|
||||
private val injector = HasAndroidInjector {
|
||||
AndroidInjector {
|
||||
}
|
||||
}
|
||||
private val pumpDescription = PumpDescription()
|
||||
|
||||
@BeforeEach
|
||||
|
@ -86,9 +89,8 @@ class SafetyPluginTest : TestBaseWithProfile() {
|
|||
@Test
|
||||
fun pumpDescriptionShouldLimitLoopInvocation() {
|
||||
pumpDescription.isTempBasalCapable = false
|
||||
var c = Constraint(true)
|
||||
c = safetyPlugin.isLoopInvocationAllowed(c)
|
||||
assertThat(c.getReasons(aapsLogger)).isEqualTo("Safety: Pump is not temp basal capable")
|
||||
val c = safetyPlugin.isLoopInvocationAllowed(ConstraintObject(true, aapsLogger))
|
||||
assertThat(c.getReasons()).isEqualTo("Safety: Pump is not temp basal capable")
|
||||
assertThat(c.value()).isFalse()
|
||||
}
|
||||
|
||||
|
@ -96,47 +98,42 @@ class SafetyPluginTest : TestBaseWithProfile() {
|
|||
fun disabledEngineeringModeShouldLimitClosedLoop() {
|
||||
`when`(sp.getString(info.nightscout.core.utils.R.string.key_aps_mode, ApsMode.OPEN.name)).thenReturn(ApsMode.CLOSED.name)
|
||||
`when`(config.isEngineeringModeOrRelease()).thenReturn(false)
|
||||
var c = Constraint(true)
|
||||
c = safetyPlugin.isClosedLoopAllowed(c)
|
||||
assertThat(c.getReasons(aapsLogger)).contains("Running dev version. Closed loop is disabled.")
|
||||
val c = safetyPlugin.isClosedLoopAllowed(ConstraintObject(true, aapsLogger))
|
||||
assertThat(c.getReasons()).contains("Running dev version. Closed loop is disabled.")
|
||||
assertThat(c.value()).isFalse()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun setOpenLoopInPreferencesShouldLimitClosedLoop() {
|
||||
`when`(sp.getString(info.nightscout.core.utils.R.string.key_aps_mode, ApsMode.OPEN.name)).thenReturn(ApsMode.OPEN.name)
|
||||
var c = Constraint(true)
|
||||
c = safetyPlugin.isClosedLoopAllowed(c)
|
||||
assertThat(c.getReasons(aapsLogger)).contains("Closed loop mode disabled in preferences")
|
||||
val c = safetyPlugin.isClosedLoopAllowed(ConstraintObject(true, aapsLogger))
|
||||
assertThat(c.getReasons()).contains("Closed loop mode disabled in preferences")
|
||||
assertThat(c.value()).isFalse()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun notEnabledSMBInPreferencesDisablesSMB() {
|
||||
`when`(sp.getBoolean(info.nightscout.plugins.aps.R.string.key_use_smb, false)).thenReturn(false)
|
||||
`when`(constraintChecker.isClosedLoopAllowed(anyObject())).thenReturn(Constraint(true))
|
||||
var c = Constraint(true)
|
||||
c = openAPSSMBPlugin.isSMBModeEnabled(c)
|
||||
assertThat(c.getReasons(aapsLogger)).contains("SMB disabled in preferences")
|
||||
`when`(constraintChecker.isClosedLoopAllowed(anyObject())).thenReturn(ConstraintObject(true, aapsLogger))
|
||||
val c = openAPSSMBPlugin.isSMBModeEnabled(ConstraintObject(true, aapsLogger))
|
||||
assertThat(c.getReasons()).contains("SMB disabled in preferences")
|
||||
assertThat(c.value()).isFalse()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun openLoopPreventsSMB() {
|
||||
`when`(sp.getBoolean(info.nightscout.plugins.aps.R.string.key_use_smb, false)).thenReturn(true)
|
||||
`when`(constraintChecker.isClosedLoopAllowed(anyObject())).thenReturn(Constraint(false))
|
||||
var c = Constraint(true)
|
||||
c = safetyPlugin.isSMBModeEnabled(c)
|
||||
assertThat(c.getReasons(aapsLogger)).contains("SMB not allowed in open loop mode")
|
||||
`when`(constraintChecker.isClosedLoopAllowed()).thenReturn(ConstraintObject(false, aapsLogger))
|
||||
val c = safetyPlugin.isSMBModeEnabled(ConstraintObject(true, aapsLogger))
|
||||
assertThat(c.getReasons()).contains("SMB not allowed in open loop mode")
|
||||
assertThat(c.value()).isFalse()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun bgSourceShouldPreventSMBAlways() {
|
||||
`when`(activePlugin.activeBgSource).thenReturn(glimpPlugin)
|
||||
var c = Constraint(true)
|
||||
c = safetyPlugin.isAdvancedFilteringEnabled(c)
|
||||
assertThat(c.getReasons(aapsLogger)).isEqualTo("Safety: SMB always and after carbs disabled because active BG source doesn\\'t support advanced filtering")
|
||||
val c = safetyPlugin.isAdvancedFilteringEnabled(ConstraintObject(true, aapsLogger))
|
||||
assertThat(c.getReasons()).isEqualTo("Safety: SMB always and after carbs disabled because active BG source doesn\\'t support advanced filtering")
|
||||
assertThat(c.value()).isFalse()
|
||||
}
|
||||
|
||||
|
@ -146,24 +143,26 @@ class SafetyPluginTest : TestBaseWithProfile() {
|
|||
`when`(sp.getDouble(info.nightscout.plugins.aps.R.string.key_openapsama_current_basal_safety_multiplier, 4.0)).thenReturn(4.0)
|
||||
`when`(sp.getDouble(info.nightscout.plugins.aps.R.string.key_openapsama_max_daily_safety_multiplier, 3.0)).thenReturn(3.0)
|
||||
`when`(sp.getString(info.nightscout.core.utils.R.string.key_age, "")).thenReturn("child")
|
||||
val c = Constraint(Constants.REALLYHIGHBASALRATE)
|
||||
val c = ConstraintObject(Double.MAX_VALUE, aapsLogger)
|
||||
safetyPlugin.applyBasalConstraints(c, validProfile)
|
||||
assertThat(c.value()).isWithin(0.01).of(2.0)
|
||||
assertThat(c.getReasons(aapsLogger)).isEqualTo(
|
||||
assertThat(c.getReasons()).isEqualTo(
|
||||
"""
|
||||
Safety: Limiting max basal rate to 2.00 U/h because of hard limit
|
||||
""".trimIndent())
|
||||
assertThat(c.getMostLimitedReasons(aapsLogger)).isEqualTo("Safety: Limiting max basal rate to 2.00 U/h because of hard limit")
|
||||
""".trimIndent()
|
||||
)
|
||||
assertThat(c.getMostLimitedReasons()).isEqualTo("Safety: Limiting max basal rate to 2.00 U/h because of hard limit")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun doNotAllowNegativeBasalRate() {
|
||||
`when`(sp.getString(info.nightscout.core.utils.R.string.key_age, "")).thenReturn("child")
|
||||
val d = Constraint(-0.5)
|
||||
val d = ConstraintObject(-0.5, aapsLogger)
|
||||
safetyPlugin.applyBasalConstraints(d, validProfile)
|
||||
assertThat(d.value()).isWithin(0.01).of(0.0)
|
||||
assertThat(d.getReasons(aapsLogger)).isEqualTo(
|
||||
"Safety: Limiting max basal rate to 0.00 U/h because of it must be positive value")
|
||||
assertThat(d.getReasons()).isEqualTo(
|
||||
"Safety: Limiting max basal rate to 0.00 U/h because of it must be positive value"
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -173,19 +172,20 @@ class SafetyPluginTest : TestBaseWithProfile() {
|
|||
`when`(sp.getDouble(info.nightscout.plugins.aps.R.string.key_openapsama_current_basal_safety_multiplier, 4.0)).thenReturn(4.0)
|
||||
`when`(sp.getDouble(info.nightscout.plugins.aps.R.string.key_openapsama_max_daily_safety_multiplier, 3.0)).thenReturn(3.0)
|
||||
`when`(sp.getString(info.nightscout.core.utils.R.string.key_age, "")).thenReturn("child")
|
||||
val i = Constraint(Constants.REALLYHIGHPERCENTBASALRATE)
|
||||
val i = ConstraintObject(Int.MAX_VALUE, aapsLogger)
|
||||
safetyPlugin.applyBasalPercentConstraints(i, validProfile)
|
||||
assertThat(i.value()).isEqualTo(200)
|
||||
assertThat(i.getReasons(aapsLogger)).isEqualTo(
|
||||
assertThat(i.getReasons()).isEqualTo(
|
||||
"""
|
||||
Safety: Percent rate 1111111% recalculated to 11111.11 U/h with current basal 1.00 U/h
|
||||
Safety: Percent rate 2147483647% recalculated to 21474836.47 U/h with current basal 1.00 U/h
|
||||
Safety: Limiting max basal rate to 2.00 U/h because of hard limit
|
||||
Safety: Limiting max percent rate to 200% because of pump limit
|
||||
Safety: Limiting max basal rate to 500.00 U/h because of pump limit
|
||||
""".trimIndent()
|
||||
)
|
||||
assertThat(i.getMostLimitedReasons(aapsLogger)).isEqualTo(
|
||||
"Safety: Limiting max percent rate to 200% because of pump limit")
|
||||
assertThat(i.getMostLimitedReasons()).isEqualTo(
|
||||
"Safety: Limiting max percent rate to 200% because of pump limit"
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -196,57 +196,58 @@ Safety: Limiting max basal rate to 500.00 U/h because of pump limit
|
|||
`when`(sp.getDouble(info.nightscout.plugins.aps.R.string.key_openapsama_max_daily_safety_multiplier, 3.0)).thenReturn(3.0)
|
||||
`when`(sp.getString(info.nightscout.core.utils.R.string.key_age, "")).thenReturn("child")
|
||||
openAPSSMBPlugin.setPluginEnabled(PluginType.APS, true)
|
||||
val i = Constraint(Constants.REALLYHIGHBASALRATE)
|
||||
val i = ConstraintObject(Double.MAX_VALUE, aapsLogger)
|
||||
openAPSSMBPlugin.applyBasalConstraints(i, validProfile)
|
||||
assertThat(i.value()).isWithin(0.01).of(1.0)
|
||||
assertThat(i.getReasons(aapsLogger)).isEqualTo(
|
||||
assertThat(i.getReasons()).isEqualTo(
|
||||
"""
|
||||
OpenAPSSMB: Limiting max basal rate to 1.00 U/h because of max value in preferences
|
||||
OpenAPSSMB: Limiting max basal rate to 4.00 U/h because of max basal multiplier
|
||||
OpenAPSSMB: Limiting max basal rate to 3.00 U/h because of max daily basal multiplier
|
||||
""".trimIndent())
|
||||
assertThat(i.getMostLimitedReasons(aapsLogger)).isEqualTo("OpenAPSSMB: Limiting max basal rate to 1.00 U/h because of max value in preferences")
|
||||
""".trimIndent()
|
||||
)
|
||||
assertThat(i.getMostLimitedReasons()).isEqualTo("OpenAPSSMB: Limiting max basal rate to 1.00 U/h because of max value in preferences")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun doNotAllowNegativePercentBasalRate() {
|
||||
`when`(sp.getString(info.nightscout.core.utils.R.string.key_age, "")).thenReturn("child")
|
||||
val i = Constraint(-22)
|
||||
val i = ConstraintObject(-22, aapsLogger)
|
||||
safetyPlugin.applyBasalPercentConstraints(i, validProfile)
|
||||
assertThat(i.value()).isEqualTo(0)
|
||||
assertThat(i.getReasons(aapsLogger)).isEqualTo(
|
||||
assertThat(i.getReasons()).isEqualTo(
|
||||
"""
|
||||
Safety: Percent rate -22% recalculated to -0.22 U/h with current basal 1.00 U/h
|
||||
Safety: Limiting max basal rate to 0.00 U/h because of it must be positive value
|
||||
Safety: Limiting max percent rate to 0% because of pump limit
|
||||
""".trimIndent())
|
||||
assertThat(i.getMostLimitedReasons(aapsLogger)).isEqualTo("Safety: Limiting max percent rate to 0% because of pump limit")
|
||||
""".trimIndent()
|
||||
)
|
||||
assertThat(i.getMostLimitedReasons()).isEqualTo("Safety: Limiting max percent rate to 0% because of pump limit")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun bolusAmountShouldBeLimited() {
|
||||
`when`(sp.getDouble(info.nightscout.core.utils.R.string.key_treatmentssafety_maxbolus, 3.0)).thenReturn(3.0)
|
||||
`when`(sp.getString(info.nightscout.core.utils.R.string.key_age, "")).thenReturn("child")
|
||||
var d = Constraint(Constants.REALLYHIGHBOLUS)
|
||||
d = safetyPlugin.applyBolusConstraints(d)
|
||||
val d = safetyPlugin.applyBolusConstraints(ConstraintObject(Double.MAX_VALUE, aapsLogger))
|
||||
assertThat(d.value()).isWithin(0.01).of(3.0)
|
||||
assertThat(d.getReasons(aapsLogger)).isEqualTo(
|
||||
assertThat(d.getReasons()).isEqualTo(
|
||||
"""
|
||||
Safety: Limiting bolus to 3.0 U because of max value in preferences
|
||||
Safety: Limiting bolus to 5.0 U because of hard limit
|
||||
""".trimIndent())
|
||||
assertThat(d.getMostLimitedReasons(aapsLogger)).isEqualTo("Safety: Limiting bolus to 3.0 U because of max value in preferences")
|
||||
""".trimIndent()
|
||||
)
|
||||
assertThat(d.getMostLimitedReasons()).isEqualTo("Safety: Limiting bolus to 3.0 U because of max value in preferences")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun doNotAllowNegativeBolusAmount() {
|
||||
`when`(sp.getDouble(info.nightscout.core.utils.R.string.key_treatmentssafety_maxbolus, 3.0)).thenReturn(3.0)
|
||||
`when`(sp.getString(info.nightscout.core.utils.R.string.key_age, "")).thenReturn("child")
|
||||
var d = Constraint(-22.0)
|
||||
d = safetyPlugin.applyBolusConstraints(d)
|
||||
val d = safetyPlugin.applyBolusConstraints(ConstraintObject(-22.0, aapsLogger))
|
||||
assertThat(d.value()).isWithin(0.01).of(0.0)
|
||||
assertThat(d.getReasons(aapsLogger)).isEqualTo("Safety: Limiting bolus to 0.0 U because of it must be positive value")
|
||||
assertThat(d.getMostLimitedReasons(aapsLogger)).isEqualTo("Safety: Limiting bolus to 0.0 U because of it must be positive value")
|
||||
assertThat(d.getReasons()).isEqualTo("Safety: Limiting bolus to 0.0 U because of it must be positive value")
|
||||
assertThat(d.getMostLimitedReasons()).isEqualTo("Safety: Limiting bolus to 0.0 U because of it must be positive value")
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -255,15 +256,15 @@ Safety: Limiting max basal rate to 500.00 U/h because of pump limit
|
|||
`when`(sp.getInt(info.nightscout.core.utils.R.string.key_treatmentssafety_maxcarbs, 48)).thenReturn(48)
|
||||
|
||||
// Negative carbs not allowed
|
||||
var i = Constraint(-22)
|
||||
var i: Constraint<Int> = ConstraintObject(-22, aapsLogger)
|
||||
safetyPlugin.applyCarbsConstraints(i)
|
||||
assertThat(i.value()).isEqualTo(0)
|
||||
assertThat(i.getReasons(aapsLogger)).isEqualTo("Safety: Limiting carbs to 0 g because of it must be positive value")
|
||||
assertThat(i.getReasons()).isEqualTo("Safety: Limiting carbs to 0 g because of it must be positive value")
|
||||
|
||||
// Apply all limits
|
||||
i = safetyPlugin.applyCarbsConstraints(Constraint(Constants.REALLYHIGHCARBS))
|
||||
i = safetyPlugin.applyCarbsConstraints(ConstraintObject(Int.MAX_VALUE, aapsLogger))
|
||||
assertThat(i.value()).isEqualTo(48)
|
||||
assertThat(i.getReasons(aapsLogger)).isEqualTo("Safety: Limiting carbs to 48 g because of max value in preferences")
|
||||
assertThat(i.getReasons()).isEqualTo("Safety: Limiting carbs to 48 g because of max value in preferences")
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -278,24 +279,24 @@ Safety: Limiting max basal rate to 500.00 U/h because of pump limit
|
|||
`when`(sp.getString(info.nightscout.core.utils.R.string.key_age, "")).thenReturn("teenage")
|
||||
|
||||
// Apply all limits
|
||||
var d = Constraint(Constants.REALLYHIGHIOB)
|
||||
var d: Constraint<Double> = ConstraintObject(Double.MAX_VALUE, aapsLogger)
|
||||
d = safetyPlugin.applyMaxIOBConstraints(d)
|
||||
assertThat(d.value()).isWithin(0.01).of(HardLimits.MAX_IOB_LGS)
|
||||
assertThat(d.getReasons(aapsLogger)).isEqualTo("Safety: Limiting IOB to 0.0 U because of Low Glucose Suspend")
|
||||
assertThat(d.getMostLimitedReasons(aapsLogger)).isEqualTo("Safety: Limiting IOB to 0.0 U because of Low Glucose Suspend")
|
||||
assertThat(d.getReasons()).isEqualTo("Safety: Limiting IOB to 0.0 U because of Low Glucose Suspend")
|
||||
assertThat(d.getMostLimitedReasons()).isEqualTo("Safety: Limiting IOB to 0.0 U because of Low Glucose Suspend")
|
||||
|
||||
// Apply all limits
|
||||
d = Constraint(Constants.REALLYHIGHIOB)
|
||||
d = ConstraintObject(Double.MAX_VALUE, aapsLogger)
|
||||
val a = openAPSAMAPlugin.applyMaxIOBConstraints(d)
|
||||
assertThat(a.value()).isWithin(0.01).of(1.5)
|
||||
assertThat(d.getReasons(aapsLogger)).isEqualTo("OpenAPSAMA: Limiting IOB to 1.5 U because of max value in preferences\nOpenAPSAMA: Limiting IOB to 7.0 U because of hard limit")
|
||||
assertThat(d.getMostLimitedReasons(aapsLogger)).isEqualTo("OpenAPSAMA: Limiting IOB to 1.5 U because of max value in preferences")
|
||||
assertThat(d.getReasons()).isEqualTo("OpenAPSAMA: Limiting IOB to 1.5 U because of max value in preferences\nOpenAPSAMA: Limiting IOB to 7.0 U because of hard limit")
|
||||
assertThat(d.getMostLimitedReasons()).isEqualTo("OpenAPSAMA: Limiting IOB to 1.5 U because of max value in preferences")
|
||||
|
||||
// Apply all limits
|
||||
d = Constraint(Constants.REALLYHIGHIOB)
|
||||
d = ConstraintObject(Double.MAX_VALUE, aapsLogger)
|
||||
val s = openAPSSMBPlugin.applyMaxIOBConstraints(d)
|
||||
assertThat(s.value()).isWithin(0.01).of(3.0)
|
||||
assertThat(d.getReasons(aapsLogger)).isEqualTo("OpenAPSSMB: Limiting IOB to 3.0 U because of max value in preferences\nOpenAPSSMB: Limiting IOB to 22.0 U because of hard limit")
|
||||
assertThat(d.getMostLimitedReasons(aapsLogger)).isEqualTo("OpenAPSSMB: Limiting IOB to 3.0 U because of max value in preferences")
|
||||
assertThat(d.getReasons()).isEqualTo("OpenAPSSMB: Limiting IOB to 3.0 U because of max value in preferences\nOpenAPSSMB: Limiting IOB to 22.0 U because of hard limit")
|
||||
assertThat(d.getMostLimitedReasons()).isEqualTo("OpenAPSSMB: Limiting IOB to 3.0 U because of max value in preferences")
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package info.nightscout.plugins.sensitivity
|
||||
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import dagger.android.AndroidInjector
|
||||
import dagger.android.HasAndroidInjector
|
||||
import info.nightscout.interfaces.aps.AutosensDataStore
|
||||
|
@ -12,7 +13,6 @@ import info.nightscout.shared.interfaces.ResourceHelper
|
|||
import info.nightscout.shared.sharedPreferences.SP
|
||||
import info.nightscout.sharedtests.TestBase
|
||||
import org.json.JSONObject
|
||||
import org.junit.jupiter.api.Assertions
|
||||
import org.junit.jupiter.api.Test
|
||||
import org.mockito.Mock
|
||||
|
||||
|
@ -45,12 +45,12 @@ class AbstractSensitivityPluginTest : TestBase() {
|
|||
fun fillResultTest() {
|
||||
val sut = SensitivityTestClass(pluginDescription, aapsLogger, rh, sp)
|
||||
var ar = sut.fillResult(1.0, 1.0, "1", "1.2", "1", 12, 0.7, 1.2)
|
||||
Assertions.assertEquals(1.0, ar.ratio, 0.01)
|
||||
assertThat(ar.ratio).isWithin(0.01).of(1.0)
|
||||
ar = sut.fillResult(1.2, 1.0, "1", "1.2", "1", 40, 0.7, 1.2)
|
||||
Assertions.assertEquals(1.16, ar.ratio, 0.01)
|
||||
assertThat(ar.ratio).isWithin(0.01).of(1.16)
|
||||
ar = sut.fillResult(1.2, 1.0, "1", "1.2", "1", 50, 0.7, 1.2)
|
||||
Assertions.assertEquals(1.2, ar.ratio, 0.01)
|
||||
assertThat(ar.ratio).isWithin(0.01).of(1.2)
|
||||
ar = sut.fillResult(1.2, 1.0, "1", "1.2", "1", 50, 0.7, 1.1)
|
||||
Assertions.assertEquals(1.1, ar.ratio, 0.01)
|
||||
assertThat(ar.ratio).isWithin(0.01).of(1.1)
|
||||
}
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
package info.nightscout.pump
|
||||
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import dagger.android.AndroidInjector
|
||||
import dagger.android.HasAndroidInjector
|
||||
import info.nightscout.core.pump.toHtml
|
||||
|
@ -8,7 +9,6 @@ import info.nightscout.plugins.aps.loop.extensions.json
|
|||
import info.nightscout.pump.virtual.extensions.toText
|
||||
import info.nightscout.sharedtests.TestBaseWithProfile
|
||||
import org.json.JSONObject
|
||||
import org.junit.jupiter.api.Assertions
|
||||
import org.junit.jupiter.api.BeforeEach
|
||||
import org.junit.jupiter.api.Test
|
||||
import org.mockito.Mockito.`when`
|
||||
|
@ -42,132 +42,132 @@ class PumpEnactResultTest : TestBaseWithProfile() {
|
|||
val per = PumpEnactResult(injector)
|
||||
|
||||
per.success(true)
|
||||
Assertions.assertEquals(true, per.success)
|
||||
assertThat(per.success).isTrue()
|
||||
}
|
||||
|
||||
@Test fun enactedTest() {
|
||||
val per = PumpEnactResult(injector)
|
||||
|
||||
per.enacted(true)
|
||||
Assertions.assertEquals(true, per.enacted)
|
||||
assertThat(per.enacted).isTrue()
|
||||
}
|
||||
|
||||
@Test fun commentTest() {
|
||||
val per = PumpEnactResult(injector)
|
||||
|
||||
per.comment("SomeComment")
|
||||
Assertions.assertEquals("SomeComment", per.comment)
|
||||
assertThat(per.comment).isEqualTo("SomeComment")
|
||||
}
|
||||
|
||||
@Test fun durationTest() {
|
||||
val per = PumpEnactResult(injector)
|
||||
|
||||
per.duration(10)
|
||||
Assertions.assertEquals(10, per.duration.toLong())
|
||||
assertThat(per.duration.toLong()).isEqualTo(10L)
|
||||
}
|
||||
|
||||
@Test fun absoluteTest() {
|
||||
val per = PumpEnactResult(injector)
|
||||
|
||||
per.absolute(11.0)
|
||||
Assertions.assertEquals(11.0, per.absolute, 0.01)
|
||||
assertThat(per.absolute).isWithin(0.01).of(11.0)
|
||||
}
|
||||
|
||||
@Test fun percentTest() {
|
||||
val per = PumpEnactResult(injector)
|
||||
|
||||
per.percent(10)
|
||||
Assertions.assertEquals(10, per.percent)
|
||||
assertThat(per.percent).isEqualTo(10)
|
||||
}
|
||||
|
||||
@Test fun isPercentTest() {
|
||||
val per = PumpEnactResult(injector)
|
||||
|
||||
per.isPercent(true)
|
||||
Assertions.assertEquals(true, per.isPercent)
|
||||
assertThat(per.isPercent).isTrue()
|
||||
}
|
||||
|
||||
@Test fun isTempCancelTest() {
|
||||
val per = PumpEnactResult(injector)
|
||||
|
||||
per.isTempCancel(true)
|
||||
Assertions.assertEquals(true, per.isTempCancel)
|
||||
assertThat(per.isTempCancel).isTrue()
|
||||
}
|
||||
|
||||
@Test fun bolusDeliveredTest() {
|
||||
val per = PumpEnactResult(injector)
|
||||
|
||||
per.bolusDelivered(11.0)
|
||||
Assertions.assertEquals(11.0, per.bolusDelivered, 0.01)
|
||||
assertThat(per.bolusDelivered).isWithin(0.01).of(11.0)
|
||||
}
|
||||
|
||||
@Test fun queuedTest() {
|
||||
val per = PumpEnactResult(injector)
|
||||
|
||||
per.queued(true)
|
||||
Assertions.assertEquals(true, per.queued)
|
||||
assertThat(per.queued).isTrue()
|
||||
}
|
||||
|
||||
@Test fun toStringTest() {
|
||||
var per = PumpEnactResult(injector).enacted(true).bolusDelivered(10.0).comment("AAA")
|
||||
Assertions.assertEquals(
|
||||
assertThat(per.toText(rh)).isEqualTo(
|
||||
"""
|
||||
Success: false
|
||||
Enacted: true
|
||||
Comment: AAA
|
||||
Insulin: 10.0 U
|
||||
""".trimIndent(), per.toText(rh)
|
||||
""".trimIndent()
|
||||
)
|
||||
per = PumpEnactResult(injector).enacted(true).isTempCancel(true).comment("AAA")
|
||||
Assertions.assertEquals(
|
||||
assertThat(per.toText(rh)).isEqualTo(
|
||||
"""
|
||||
Success: false
|
||||
Enacted: true
|
||||
Comment: AAA
|
||||
Cancel temp basal
|
||||
""".trimIndent(), per.toText(rh)
|
||||
""".trimIndent()
|
||||
)
|
||||
per = PumpEnactResult(injector).enacted(true).isPercent(true).percent(90).duration(20).comment("AAA")
|
||||
Assertions.assertEquals(
|
||||
assertThat(per.toText(rh)).isEqualTo(
|
||||
"""
|
||||
Success: false
|
||||
Enacted: true
|
||||
Comment: AAA
|
||||
Duration: 20 min
|
||||
Percent: 90%
|
||||
""".trimIndent(), per.toText(rh)
|
||||
""".trimIndent()
|
||||
)
|
||||
per = PumpEnactResult(injector).enacted(true).isPercent(false).absolute(1.0).duration(30).comment("AAA")
|
||||
Assertions.assertEquals(
|
||||
assertThat(per.toText(rh)).isEqualTo(
|
||||
"""
|
||||
Success: false
|
||||
Enacted: true
|
||||
Comment: AAA
|
||||
Duration: 30 min
|
||||
Absolute: 1.0 U/h
|
||||
""".trimIndent(), per.toText(rh)
|
||||
""".trimIndent()
|
||||
)
|
||||
per = PumpEnactResult(injector).enacted(false).comment("AAA")
|
||||
Assertions.assertEquals(
|
||||
assertThat(per.toText(rh)).isEqualTo(
|
||||
"""
|
||||
Success: false
|
||||
Comment: AAA
|
||||
""".trimIndent(), per.toText(rh)
|
||||
""".trimIndent()
|
||||
)
|
||||
}
|
||||
|
||||
@Test fun toHtmlTest() {
|
||||
|
||||
var per: PumpEnactResult = PumpEnactResult(injector).enacted(true).bolusDelivered(10.0).comment("AAA")
|
||||
Assertions.assertEquals("<b>Success</b>: false<br><b>Enacted</b>: true<br><b>Comment</b>: AAA<br><b>SMB</b>: 10.0 U", per.toHtml(rh, decimalFormatter))
|
||||
assertThat(per.toHtml(rh, decimalFormatter)).isEqualTo("<b>Success</b>: false<br><b>Enacted</b>: true<br><b>Comment</b>: AAA<br><b>SMB</b>: 10.0 U")
|
||||
per = PumpEnactResult(injector).enacted(true).isTempCancel(true).comment("AAA")
|
||||
Assertions.assertEquals("<b>Success</b>: false<br><b>Enacted</b>: true<br><b>Comment</b>: AAA<br>Cancel temp basal", per.toHtml(rh, decimalFormatter))
|
||||
assertThat(per.toHtml(rh, decimalFormatter)).isEqualTo("<b>Success</b>: false<br><b>Enacted</b>: true<br><b>Comment</b>: AAA<br>Cancel temp basal")
|
||||
per = PumpEnactResult(injector).enacted(true).isPercent(true).percent(90).duration(20).comment("AAA")
|
||||
Assertions.assertEquals("<b>Success</b>: false<br><b>Enacted</b>: true<br><b>Comment</b>: AAA<br><b>Duration</b>: 20 min<br><b>Percent</b>: 90%", per.toHtml(rh, decimalFormatter))
|
||||
assertThat(per.toHtml(rh, decimalFormatter)).isEqualTo("<b>Success</b>: false<br><b>Enacted</b>: true<br><b>Comment</b>: AAA<br><b>Duration</b>: 20 min<br><b>Percent</b>: 90%")
|
||||
per = PumpEnactResult(injector).enacted(true).isPercent(false).absolute(1.0).duration(30).comment("AAA")
|
||||
Assertions.assertEquals("<b>Success</b>: false<br><b>Enacted</b>: true<br><b>Comment</b>: AAA<br><b>Duration</b>: 30 min<br><b>Absolute</b>: 1.00 U/h", per.toHtml(rh, decimalFormatter))
|
||||
assertThat(per.toHtml(rh, decimalFormatter)).isEqualTo("<b>Success</b>: false<br><b>Enacted</b>: true<br><b>Comment</b>: AAA<br><b>Duration</b>: 30 min<br><b>Absolute</b>: 1.00 U/h")
|
||||
per = PumpEnactResult(injector).enacted(false).comment("AAA")
|
||||
Assertions.assertEquals("<b>Success</b>: false<br><b>Comment</b>: AAA", per.toHtml(rh, decimalFormatter))
|
||||
assertThat(per.toHtml(rh, decimalFormatter)).isEqualTo("<b>Success</b>: false<br><b>Comment</b>: AAA")
|
||||
}
|
||||
|
||||
@Test fun jsonTest() {
|
||||
|
@ -175,15 +175,15 @@ class PumpEnactResultTest : TestBaseWithProfile() {
|
|||
|
||||
var per: PumpEnactResult = PumpEnactResult(injector).enacted(true).bolusDelivered(10.0).comment("AAA")
|
||||
o = per.json(validProfile.getBasal())
|
||||
JSONAssert.assertEquals("{\"smb\":10}", o, false)
|
||||
JSONAssert.assertEquals("""{"smb":10}""", o, false)
|
||||
per = PumpEnactResult(injector).enacted(true).isTempCancel(true).comment("AAA")
|
||||
o = per.json(validProfile.getBasal())
|
||||
JSONAssert.assertEquals("{\"rate\":0,\"duration\":0}", o, false)
|
||||
JSONAssert.assertEquals("""{"rate":0,"duration":0}""", o, false)
|
||||
per = PumpEnactResult(injector).enacted(true).isPercent(true).percent(90).duration(20).comment("AAA")
|
||||
o = per.json(validProfile.getBasal())
|
||||
JSONAssert.assertEquals("{\"rate\":0.9,\"duration\":20}", o, false)
|
||||
JSONAssert.assertEquals("""{"rate":0.9,"duration":20}""", o, false)
|
||||
per = PumpEnactResult(injector).enacted(true).isPercent(false).absolute(1.0).duration(30).comment("AAA")
|
||||
o = per.json(validProfile.getBasal())
|
||||
JSONAssert.assertEquals("{\"rate\":1,\"duration\":30}", o, false)
|
||||
JSONAssert.assertEquals("""{"rate":1,"duration":30}""", o, false)
|
||||
}
|
||||
}
|
|
@ -62,7 +62,7 @@ buildscript {
|
|||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:8.1.1'
|
||||
classpath 'com.google.gms:google-services:4.3.15'
|
||||
classpath 'com.google.gms:google-services:4.4.0'
|
||||
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.9'
|
||||
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
|
@ -79,7 +79,7 @@ buildscript {
|
|||
plugins {
|
||||
// Test Gradle build, keep disabled under normal circumstances
|
||||
// id "com.osacky.doctor" version "0.8.1"
|
||||
id "org.jlleitschuh.gradle.ktlint" version "11.5.1"
|
||||
id "org.jlleitschuh.gradle.ktlint" version "11.6.0"
|
||||
// Aggregates and/or logs Jacoco test coverage to the Gradle build log
|
||||
//id 'org.barfuin.gradle.jacocolog' version '3.1.0'
|
||||
id 'org.jetbrains.kotlin.android' version "$kotlin_version" apply false
|
||||
|
|
|
@ -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'
|
||||
}
|
|
@ -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
|
|
@ -1,6 +1,6 @@
|
|||
package info.nightscout.interfaces
|
||||
|
||||
enum class ApsMode() {
|
||||
enum class ApsMode {
|
||||
OPEN,
|
||||
CLOSED,
|
||||
LGS,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -1,22 +1,11 @@
|
|||
package info.nightscout.interfaces.aps
|
||||
|
||||
import org.json.JSONObject
|
||||
|
||||
class AutosensResult {
|
||||
data class AutosensResult(
|
||||
|
||||
//default values to show when autosens algorithm is not called
|
||||
var ratio = 1.0
|
||||
var carbsAbsorbed = 0.0
|
||||
var sensResult = "autosens not available"
|
||||
var pastSensitivity = ""
|
||||
var ratioLimit = ""
|
||||
|
||||
fun json(): JSONObject = JSONObject()
|
||||
.put("ratio", ratio)
|
||||
.put("ratioLimit", ratioLimit)
|
||||
.put("pastSensitivity", pastSensitivity)
|
||||
.put("sensResult", sensResult)
|
||||
.put("ratio", ratio)
|
||||
|
||||
override fun toString(): String = json().toString()
|
||||
}
|
||||
var ratio: Double = 1.0,
|
||||
var carbsAbsorbed: Double = 0.0,
|
||||
var sensResult: String = "autosens not available",
|
||||
var pastSensitivity: String = "",
|
||||
var ratioLimit: String = ""
|
||||
)
|
|
@ -1,16 +1,9 @@
|
|||
package info.nightscout.interfaces.aps
|
||||
|
||||
import info.nightscout.database.entities.DeviceStatus
|
||||
import info.nightscout.database.entities.OfflineEvent
|
||||
import info.nightscout.interfaces.configBuilder.RunningConfiguration
|
||||
import info.nightscout.interfaces.constraints.Constraint
|
||||
import info.nightscout.interfaces.iob.IobCobCalculator
|
||||
import info.nightscout.interfaces.profile.Profile
|
||||
import info.nightscout.interfaces.profile.ProfileFunction
|
||||
import info.nightscout.interfaces.pump.Pump
|
||||
import info.nightscout.interfaces.pump.PumpEnactResult
|
||||
import info.nightscout.interfaces.receivers.ReceiverStatusStore
|
||||
import info.nightscout.shared.utils.DateUtil
|
||||
|
||||
interface Loop {
|
||||
|
||||
|
@ -47,14 +40,5 @@ interface Loop {
|
|||
fun goToZeroTemp(durationInMinutes: Int, profile: Profile, reason: OfflineEvent.Reason)
|
||||
fun suspendLoop(durationInMinutes: Int)
|
||||
fun disableCarbSuggestions(durationMinutes: Int)
|
||||
fun buildDeviceStatus(
|
||||
dateUtil: DateUtil,
|
||||
loop: Loop,
|
||||
iobCobCalculatorPlugin: IobCobCalculator,
|
||||
profileFunction: ProfileFunction,
|
||||
pump: Pump,
|
||||
receiverStatusStore: ReceiverStatusStore,
|
||||
runningConfiguration: RunningConfiguration,
|
||||
version: String
|
||||
): DeviceStatus?
|
||||
fun buildAndStoreDeviceStatus()
|
||||
}
|
|
@ -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<*>)
|
||||
}
|
|
@ -1,58 +0,0 @@
|
|||
package info.nightscout.interfaces.constraints
|
||||
|
||||
import info.nightscout.interfaces.Constants
|
||||
import info.nightscout.interfaces.profile.Profile
|
||||
|
||||
/**
|
||||
* Constraints interface
|
||||
*
|
||||
* Every function has a param from previous chained call
|
||||
* Function can limit the value even more and add another reason of restriction
|
||||
*
|
||||
* see [info.nightscout.implementation.constraints.ConstraintsImpl]
|
||||
* which iterates over all registered plugins with [Constraints] implemented
|
||||
*
|
||||
* @return updated parameter
|
||||
*/
|
||||
interface Constraints {
|
||||
|
||||
fun isLoopInvocationAllowed(value: Constraint<Boolean> = Constraint(true)): Constraint<Boolean> = value
|
||||
fun isClosedLoopAllowed(value: Constraint<Boolean> = Constraint(true)): Constraint<Boolean> = value
|
||||
fun isLgsAllowed(value: Constraint<Boolean> = Constraint(true)): Constraint<Boolean> = value
|
||||
fun isAutosensModeEnabled(value: Constraint<Boolean> = Constraint(true)): Constraint<Boolean> = value
|
||||
fun isSMBModeEnabled(value: Constraint<Boolean> = Constraint(true)): Constraint<Boolean> = value
|
||||
fun isDynIsfModeEnabled(value: Constraint<Boolean> = Constraint(true)): Constraint<Boolean> = value
|
||||
fun isUAMEnabled(value: Constraint<Boolean> = Constraint(true)): Constraint<Boolean> = value
|
||||
fun isAdvancedFilteringEnabled(value: Constraint<Boolean> = Constraint(true)): Constraint<Boolean> = value
|
||||
fun isSuperBolusEnabled(value: Constraint<Boolean> = Constraint(true)): Constraint<Boolean> = value
|
||||
fun isAutomationEnabled(value: Constraint<Boolean> = Constraint(true)): Constraint<Boolean> = value
|
||||
fun applyBasalConstraints(absoluteRate: Constraint<Double>, profile: Profile): Constraint<Double> = absoluteRate
|
||||
fun applyBasalPercentConstraints(percentRate: Constraint<Int>, profile: Profile): Constraint<Int> = percentRate
|
||||
fun applyBolusConstraints(insulin: Constraint<Double>): Constraint<Double> = insulin
|
||||
fun applyExtendedBolusConstraints(insulin: Constraint<Double>): Constraint<Double> = insulin
|
||||
fun applyCarbsConstraints(carbs: Constraint<Int>): Constraint<Int> = carbs
|
||||
fun applyMaxIOBConstraints(maxIob: Constraint<Double>): Constraint<Double> = maxIob
|
||||
|
||||
/*
|
||||
* Determine max values by walking through all constraints
|
||||
*/
|
||||
fun getMaxBasalAllowed(profile: Profile): Constraint<Double> =
|
||||
applyBasalConstraints(Constraint(Constants.REALLYHIGHBASALRATE), profile)
|
||||
|
||||
fun getMaxBasalPercentAllowed(profile: Profile): Constraint<Int> =
|
||||
applyBasalPercentConstraints(Constraint(Constants.REALLYHIGHPERCENTBASALRATE), profile)
|
||||
|
||||
fun getMaxBolusAllowed(): Constraint<Double> =
|
||||
applyBolusConstraints(Constraint(Constants.REALLYHIGHBOLUS))
|
||||
|
||||
fun getMaxExtendedBolusAllowed(): Constraint<Double> =
|
||||
applyExtendedBolusConstraints(Constraint(Constants.REALLYHIGHBOLUS))
|
||||
|
||||
fun getMaxCarbsAllowed(): Constraint<Int> =
|
||||
applyCarbsConstraints(Constraint(Constants.REALLYHIGHCARBS))
|
||||
|
||||
fun getMaxIOBAllowed(): Constraint<Double> =
|
||||
applyMaxIOBConstraints(Constraint(Constants.REALLYHIGHIOB))
|
||||
|
||||
|
||||
}
|
|
@ -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>
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -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)
|
|
@ -0,0 +1,7 @@
|
|||
package info.nightscout.interfaces.maintenance
|
||||
|
||||
import android.os.Parcelable
|
||||
import kotlinx.parcelize.Parcelize
|
||||
|
||||
@Parcelize
|
||||
data class PrefMetadata(var value: String, var status: PrefsStatus, var info: String? = null) : Parcelable
|
|
@ -0,0 +1,11 @@
|
|||
package info.nightscout.interfaces.maintenance
|
||||
|
||||
import android.content.Context
|
||||
|
||||
interface PrefsMetadataKey {
|
||||
|
||||
val key: String
|
||||
val icon: Int
|
||||
val label: Int
|
||||
fun formatForDisplay(context: Context, value: String): String
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue