Merge branch 'dev' into wear/extract-simple-ui
2
.github/ISSUE_TEMPLATE/custom.md
vendored
|
@ -15,5 +15,5 @@ Reporting bugs
|
|||
upper-right corner).
|
||||
- Obtain the app's log files, which can be found on the phone in
|
||||
_/storage/emulated/0/Android/data/info.nightscout.androidaps/_
|
||||
See https://androidaps.readthedocs.io/en/latest/Usage/Accessing-logfiles.html
|
||||
See https://wiki.aaps.app/en/latest/Usage/Accessing-logfiles.html
|
||||
- Open an issue at https://github.com/nightscout/AndroidAPS/issues/new
|
||||
|
|
|
@ -7,9 +7,9 @@ General rules
|
|||
=============
|
||||
|
||||
* There are plenty of ways you can help, some of them are listed on wiki:
|
||||
https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/How-can-I-help.html
|
||||
https://wiki.aaps.app/en/latest/EN/Getting-Started/How-can-I-help.html
|
||||
* If you wish to help with documentation or translating:
|
||||
https://androidaps.readthedocs.io/en/latest/EN/translations.html
|
||||
https://wiki.aaps.app/en/latest/EN/translations.html
|
||||
|
||||
Development guidelines
|
||||
======================
|
||||
|
|
|
@ -6,5 +6,5 @@ Reporting bugs
|
|||
upper-right corner).
|
||||
- Obtain the app's log files, which can be found on the phone in
|
||||
_/storage/emulated/0/Android/data/info.nightscout.androidaps/_
|
||||
See https://androidaps.readthedocs.io/en/latest/EN/Usage/Accessing-logfiles.html
|
||||
See https://wiki.aaps.app/en/latest/EN/Usage/Accessing-logfiles.html
|
||||
- Open an issue at https://github.com/nightscout/AndroidAPS/issues/new
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
package info.nightscout.androidaps.workflow
|
||||
|
||||
import info.nightscout.interfaces.workflow.WorkerClasses
|
||||
import info.nightscout.plugins.general.food.FoodPlugin
|
||||
import info.nightscout.plugins.profile.ProfilePlugin
|
||||
import info.nightscout.source.NSClientSourcePlugin
|
||||
import javax.inject.Inject
|
||||
|
@ -10,5 +9,4 @@ class WorkerClassesImpl @Inject constructor(): WorkerClasses{
|
|||
|
||||
override val nsClientSourceWorker = NSClientSourcePlugin.NSClientSourceWorker::class.java
|
||||
override val nsProfileWorker = ProfilePlugin.NSProfileWorker::class.java
|
||||
override val foodWorker = FoodPlugin.FoodWorker::class.java
|
||||
}
|
|
@ -7,7 +7,6 @@ import info.nightscout.core.pump.toHtml
|
|||
import info.nightscout.interfaces.pump.PumpEnactResult
|
||||
import info.nightscout.plugins.aps.loop.extensions.json
|
||||
import info.nightscout.pump.virtual.extensions.toText
|
||||
import info.nightscout.plugins.sync.nsShared.extensions.log
|
||||
import org.json.JSONObject
|
||||
import org.junit.jupiter.api.Assertions
|
||||
import org.junit.jupiter.api.BeforeEach
|
||||
|
@ -109,15 +108,6 @@ class PumpEnactResultTest : TestBaseWithProfile() {
|
|||
Assertions.assertEquals(true, per.queued)
|
||||
}
|
||||
|
||||
@Test fun logTest() {
|
||||
val per = PumpEnactResult(injector)
|
||||
|
||||
Assertions.assertEquals(
|
||||
"Success: false Enacted: false Comment: Duration: -1 Absolute: -1.0 Percent: -1 IsPercent: false IsTempCancel: false bolusDelivered: 0.0 Queued: false",
|
||||
per.log()
|
||||
)
|
||||
}
|
||||
|
||||
@Test fun toStringTest() {
|
||||
var per = PumpEnactResult(injector).enacted(true).bolusDelivered(10.0).comment("AAA")
|
||||
Assertions.assertEquals(
|
||||
|
|
1
connectwsa.bat
Normal file
|
@ -0,0 +1 @@
|
|||
adb connect 127.0.0.1:58526
|
|
@ -27,11 +27,11 @@ interface StoreDataForDb {
|
|||
val temporaryBasals: MutableList<TemporaryBasal>
|
||||
val profileSwitches: MutableList<ProfileSwitch>
|
||||
val offlineEvents: MutableList<OfflineEvent>
|
||||
val foods: MutableList<Food>
|
||||
|
||||
val nsIdGlucoseValues: MutableList<GlucoseValue>
|
||||
val nsIdBoluses: MutableList<Bolus>
|
||||
val nsIdCarbs: MutableList<Carbs>
|
||||
val nsIdFoods: MutableList<Food>
|
||||
val nsIdTemporaryTargets: MutableList<TemporaryTarget>
|
||||
val nsIdEffectiveProfileSwitches: MutableList<EffectiveProfileSwitch>
|
||||
val nsIdBolusCalculatorResults: MutableList<BolusCalculatorResult>
|
||||
|
@ -41,8 +41,10 @@ interface StoreDataForDb {
|
|||
val nsIdProfileSwitches: MutableList<ProfileSwitch>
|
||||
val nsIdOfflineEvents: MutableList<OfflineEvent>
|
||||
val nsIdDeviceStatuses: MutableList<DeviceStatus>
|
||||
val nsIdFoods: MutableList<Food>
|
||||
|
||||
fun storeTreatmentsToDb()
|
||||
fun storeGlucoseValuesToDb()
|
||||
fun storeFoodsToDb()
|
||||
fun scheduleNsIdUpdate()
|
||||
}
|
|
@ -16,7 +16,7 @@ interface NsClient : Sync {
|
|||
fun textLog(): Spanned
|
||||
fun clearLog()
|
||||
|
||||
enum class Collection { ENTRIES, TREATMENTS}
|
||||
enum class Collection { ENTRIES, TREATMENTS, FOODS }
|
||||
/**
|
||||
* NSC v3 does first load of all data
|
||||
* next loads are using srvModified property for sync
|
||||
|
|
|
@ -5,5 +5,4 @@ import androidx.work.ListenableWorker
|
|||
interface WorkerClasses {
|
||||
val nsClientSourceWorker: Class<out ListenableWorker>
|
||||
val nsProfileWorker: Class<out ListenableWorker>
|
||||
val foodWorker: Class<out ListenableWorker>
|
||||
}
|
|
@ -4,14 +4,17 @@ import android.content.Context
|
|||
import info.nightscout.sdk.exceptions.DateHeaderOutOfToleranceException
|
||||
import info.nightscout.sdk.exceptions.InvalidAccessTokenException
|
||||
import info.nightscout.sdk.exceptions.InvalidFormatNightscoutException
|
||||
import info.nightscout.sdk.exceptions.UnsuccessfullNightscoutException
|
||||
import info.nightscout.sdk.exceptions.UnknownResponseNightscoutException
|
||||
import info.nightscout.sdk.exceptions.UnsuccessfullNightscoutException
|
||||
import info.nightscout.sdk.interfaces.NSAndroidClient
|
||||
import info.nightscout.sdk.localmodel.Status
|
||||
import info.nightscout.sdk.localmodel.entry.NSSgvV3
|
||||
import info.nightscout.sdk.localmodel.food.NSFood
|
||||
import info.nightscout.sdk.localmodel.treatment.CreateUpdateResponse
|
||||
import info.nightscout.sdk.localmodel.treatment.NSTreatment
|
||||
import info.nightscout.sdk.mapper.toLocal
|
||||
import info.nightscout.sdk.mapper.toNSFood
|
||||
import info.nightscout.sdk.mapper.toRemoteFood
|
||||
import info.nightscout.sdk.mapper.toRemoteTreatment
|
||||
import info.nightscout.sdk.mapper.toSgv
|
||||
import info.nightscout.sdk.mapper.toTreatment
|
||||
|
@ -19,6 +22,7 @@ import info.nightscout.sdk.networking.NetworkStackBuilder
|
|||
import info.nightscout.sdk.remotemodel.LastModified
|
||||
import info.nightscout.sdk.remotemodel.RemoteDeviceStatus
|
||||
import info.nightscout.sdk.remotemodel.RemoteEntry
|
||||
import info.nightscout.sdk.remotemodel.RemoteFood
|
||||
import info.nightscout.sdk.remotemodel.RemoteTreatment
|
||||
import info.nightscout.sdk.utils.retry
|
||||
import info.nightscout.sdk.utils.toNotNull
|
||||
|
@ -140,9 +144,9 @@ class NSAndroidClientImpl(
|
|||
}
|
||||
}
|
||||
|
||||
override suspend fun getTreatmentsNewerThan(from: Long, limit: Long): List<NSTreatment> = callWrapper(dispatcher) {
|
||||
override suspend fun getTreatmentsNewerThan(createdAt: String, limit: Long): List<NSTreatment> = callWrapper(dispatcher) {
|
||||
|
||||
val response = api.getTreatmentsNewerThan(from, limit)
|
||||
val response = api.getTreatmentsNewerThan(createdAt, limit)
|
||||
if (response.isSuccessful) {
|
||||
return@callWrapper response.body()?.result?.map(RemoteTreatment::toTreatment).toNotNull()
|
||||
} else {
|
||||
|
@ -154,7 +158,8 @@ class NSAndroidClientImpl(
|
|||
|
||||
val response = api.getTreatmentsModifiedSince(from, limit)
|
||||
val eTagString = response.headers()["ETag"]
|
||||
val eTag = eTagString?.substring(3, eTagString.length - 1)?.toLong() ?: throw UnsuccessfullNightscoutException()
|
||||
val eTag = eTagString?.substring(3, eTagString.length - 1)?.toLong()
|
||||
?: throw UnsuccessfullNightscoutException()
|
||||
if (response.isSuccessful) {
|
||||
return@callWrapper NSAndroidClient.ReadResponse(eTag, response.body()?.result?.map(RemoteTreatment::toTreatment).toNotNull())
|
||||
} else {
|
||||
|
@ -207,6 +212,64 @@ class NSAndroidClientImpl(
|
|||
}
|
||||
}
|
||||
|
||||
override suspend fun getFoods(limit: Long): List<NSFood> = callWrapper(dispatcher) {
|
||||
|
||||
val response = api.getFoods(limit)
|
||||
if (response.isSuccessful) {
|
||||
return@callWrapper response.body()?.result?.map(RemoteFood::toNSFood).toNotNull()
|
||||
} else {
|
||||
throw UnsuccessfullNightscoutException()
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
override suspend fun getFoodsModifiedSince(from: Long, limit: Long): NSAndroidClient.ReadResponse<List<NSFood>> = callWrapper(dispatcher) {
|
||||
|
||||
val response = api.getFoodsModifiedSince(from, limit)
|
||||
val eTagString = response.headers()["ETag"]
|
||||
val eTag = eTagString?.substring(3, eTagString.length - 1)?.toLong() ?: throw UnsuccessfullNightscoutException()
|
||||
if (response.isSuccessful) {
|
||||
return@callWrapper NSAndroidClient.ReadResponse(eTag, response.body()?.result?.map(RemoteFood::toNSFood).toNotNull())
|
||||
} else {
|
||||
throw UnsuccessfullNightscoutException()
|
||||
}
|
||||
}
|
||||
*/
|
||||
override suspend fun createFood(nsFood: NSFood): CreateUpdateResponse = callWrapper(dispatcher) {
|
||||
|
||||
val remoteFood = nsFood.toRemoteFood()
|
||||
remoteFood.app = "AAPS"
|
||||
val response = api.createFood(remoteFood)
|
||||
if (response.isSuccessful) {
|
||||
return@callWrapper CreateUpdateResponse(
|
||||
response = response.code(),
|
||||
identifier = response.body()?.result?.identifier ?: throw UnknownResponseNightscoutException(),
|
||||
isDeduplication = response.body()?.result?.isDeduplication ?: false,
|
||||
deduplicatedIdentifier = response.body()?.result?.deduplicatedIdentifier,
|
||||
lastModified = response.body()?.result?.lastModified
|
||||
)
|
||||
} else {
|
||||
throw UnsuccessfullNightscoutException()
|
||||
}
|
||||
}
|
||||
|
||||
override suspend fun updateFood(nsFood: NSFood): CreateUpdateResponse = callWrapper(dispatcher) {
|
||||
|
||||
val remoteFood = nsFood.toRemoteFood()
|
||||
val response = api.updateFood(remoteFood)
|
||||
if (response.isSuccessful) {
|
||||
return@callWrapper CreateUpdateResponse(
|
||||
response = response.code(),
|
||||
identifier = response.body()?.result?.identifier ?: throw UnknownResponseNightscoutException(),
|
||||
isDeduplication = response.body()?.result?.isDeduplication ?: false,
|
||||
deduplicatedIdentifier = response.body()?.result?.deduplicatedIdentifier,
|
||||
lastModified = response.body()?.result?.lastModified
|
||||
)
|
||||
} else {
|
||||
throw UnsuccessfullNightscoutException()
|
||||
}
|
||||
}
|
||||
|
||||
private suspend fun <T> callWrapper(dispatcher: CoroutineDispatcher, block: suspend () -> T): T =
|
||||
withContext(dispatcher) {
|
||||
retry(
|
||||
|
|
|
@ -2,6 +2,7 @@ package info.nightscout.sdk.interfaces
|
|||
|
||||
import info.nightscout.sdk.localmodel.Status
|
||||
import info.nightscout.sdk.localmodel.entry.NSSgvV3
|
||||
import info.nightscout.sdk.localmodel.food.NSFood
|
||||
import info.nightscout.sdk.localmodel.treatment.CreateUpdateResponse
|
||||
import info.nightscout.sdk.localmodel.treatment.NSTreatment
|
||||
import info.nightscout.sdk.remotemodel.LastModified
|
||||
|
@ -23,9 +24,13 @@ interface NSAndroidClient {
|
|||
suspend fun getSgvs(): List<NSSgvV3>
|
||||
suspend fun getSgvsModifiedSince(from: Long, limit: Long): ReadResponse<List<NSSgvV3>>
|
||||
suspend fun getSgvsNewerThan(from: Long, limit: Long): List<NSSgvV3>
|
||||
suspend fun getTreatmentsNewerThan(from: Long, limit: Long): List<NSTreatment>
|
||||
suspend fun getTreatmentsNewerThan(createdAt: String, limit: Long): List<NSTreatment>
|
||||
suspend fun getTreatmentsModifiedSince(from: Long, limit: Long): ReadResponse<List<NSTreatment>>
|
||||
suspend fun getDeviceStatusModifiedSince(from: Long): List<RemoteDeviceStatus>
|
||||
suspend fun createTreatment(nsTreatment: NSTreatment): CreateUpdateResponse
|
||||
suspend fun updateTreatment(nsTreatment: NSTreatment): CreateUpdateResponse
|
||||
suspend fun getFoods(limit: Long): List<NSFood>
|
||||
//suspend fun getFoodsModifiedSince(from: Long, limit: Long): ReadResponse<List<NSFood>>
|
||||
suspend fun createFood(nsFood: NSFood): CreateUpdateResponse
|
||||
suspend fun updateFood(nsFood: NSFood): CreateUpdateResponse
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
package info.nightscout.sdk.localmodel.food
|
||||
|
||||
import info.nightscout.sdk.localmodel.entry.NsUnits
|
||||
|
||||
data class NSFood(
|
||||
val date: Long,
|
||||
val device: String? = null,
|
||||
val identifier: String?,
|
||||
val units: NsUnits? = null,
|
||||
val srvModified: Long? = null,
|
||||
val srvCreated: Long? = null,
|
||||
val subject: String? = null,
|
||||
var isReadOnly: Boolean = false,
|
||||
val isValid: Boolean,
|
||||
var app: String? = null,
|
||||
var name: String,
|
||||
var category: String? = null,
|
||||
var subCategory: String? = null,
|
||||
// Example:
|
||||
// name="juice" portion=250 units="ml" carbs=12
|
||||
// means 250ml of juice has 12g of carbs
|
||||
|
||||
var portion: Double, // common portion in "units"
|
||||
var carbs: Int, // in grams
|
||||
var fat: Int? = null, // in grams
|
||||
var protein: Int? = null, // in grams
|
||||
var energy: Int? = null, // in kJ
|
||||
var unit: String = "g",
|
||||
var gi: Int? = null // not used yet
|
||||
)
|
|
@ -34,6 +34,7 @@ enum class EventType(val text: String) {
|
|||
@SerializedName("Temp Basal Start") TEMPORARY_BASAL_START("Temp Basal Start"),
|
||||
@SerializedName("Temp Basal End") TEMPORARY_BASAL_END("Temp Basal End"),
|
||||
|
||||
@SerializedName("") ERROR(""),
|
||||
@SerializedName("<none>") NONE("<none>");
|
||||
|
||||
companion object {
|
||||
|
|
|
@ -0,0 +1,64 @@
|
|||
package info.nightscout.sdk.mapper
|
||||
|
||||
import info.nightscout.sdk.localmodel.food.NSFood
|
||||
import info.nightscout.sdk.remotemodel.RemoteFood
|
||||
|
||||
/**
|
||||
* Convert to [RemoteFood] and back to [NSFood]
|
||||
* testing purpose only
|
||||
*
|
||||
* @return treatment after double conversion
|
||||
*/
|
||||
fun NSFood.convertToRemoteAndBack(): NSFood? =
|
||||
toRemoteFood().toNSFood()
|
||||
|
||||
internal fun RemoteFood.toNSFood(): NSFood? {
|
||||
when (type) {
|
||||
"food" ->
|
||||
return NSFood(
|
||||
date = date ?: 0L,
|
||||
device = device,
|
||||
identifier = identifier,
|
||||
unit = unit ?: "g",
|
||||
srvModified = srvModified,
|
||||
srvCreated = srvCreated,
|
||||
subject = subject,
|
||||
isReadOnly = isReadOnly ?: false,
|
||||
isValid = isValid ?: true,
|
||||
name = name,
|
||||
category = category,
|
||||
subCategory = subcategory,
|
||||
portion = portion,
|
||||
carbs = carbs,
|
||||
fat = fat,
|
||||
protein = protein,
|
||||
energy = energy,
|
||||
gi = gi
|
||||
)
|
||||
|
||||
else -> return null
|
||||
}
|
||||
}
|
||||
|
||||
internal fun NSFood.toRemoteFood(): RemoteFood =
|
||||
RemoteFood(
|
||||
type = "food",
|
||||
date = date,
|
||||
device = device,
|
||||
identifier = identifier,
|
||||
unit = unit,
|
||||
srvModified = srvModified,
|
||||
srvCreated = srvCreated,
|
||||
subject = subject,
|
||||
isReadOnly = isReadOnly,
|
||||
isValid = isValid,
|
||||
name = name,
|
||||
category = category,
|
||||
subcategory = subCategory,
|
||||
portion = portion,
|
||||
carbs = carbs,
|
||||
fat = fat,
|
||||
protein = protein,
|
||||
energy = energy,
|
||||
gi = gi
|
||||
)
|
|
@ -6,6 +6,7 @@ import info.nightscout.sdk.remotemodel.NSResponse
|
|||
import info.nightscout.sdk.remotemodel.RemoteCreateUpdateResponse
|
||||
import info.nightscout.sdk.remotemodel.RemoteDeviceStatus
|
||||
import info.nightscout.sdk.remotemodel.RemoteEntry
|
||||
import info.nightscout.sdk.remotemodel.RemoteFood
|
||||
import info.nightscout.sdk.remotemodel.RemoteStatusResponse
|
||||
import info.nightscout.sdk.remotemodel.RemoteTreatment
|
||||
import retrofit2.Response
|
||||
|
@ -48,7 +49,7 @@ internal interface NightscoutRemoteService {
|
|||
suspend fun getSgvsModifiedSince(@Path("from") from: Long, @Query("limit") limit: Long): Response<NSResponse<List<RemoteEntry>>>
|
||||
|
||||
@GET("v3/treatments")
|
||||
suspend fun getTreatmentsNewerThan(@Query(value = "date\$gt", encoded = true) date: Long, @Query("limit") limit: Long): Response<NSResponse<List<RemoteTreatment>>>
|
||||
suspend fun getTreatmentsNewerThan(@Query(value = "created_at\$gt", encoded = true) createdAt: String, @Query("limit") limit: Long): Response<NSResponse<List<RemoteTreatment>>>
|
||||
|
||||
@GET("v3/treatments/history/{from}")
|
||||
suspend fun getTreatmentsModifiedSince(@Path("from") from: Long, @Query("limit") limit: Long): Response<NSResponse<List<RemoteTreatment>>>
|
||||
|
@ -62,4 +63,16 @@ internal interface NightscoutRemoteService {
|
|||
@PUT("v3/treatments")
|
||||
suspend fun updateTreatment(@Body remoteTreatment: RemoteTreatment): Response<NSResponse<RemoteCreateUpdateResponse>>
|
||||
|
||||
@GET("v3/food")
|
||||
suspend fun getFoods(@Query("limit") limit: Long): Response<NSResponse<List<RemoteFood>>>
|
||||
/*
|
||||
@GET("v3/food/history/{from}")
|
||||
suspend fun getFoodsModifiedSince(@Path("from") from: Long, @Query("limit") limit: Long): Response<NSResponse<List<RemoteFood>>>
|
||||
*/
|
||||
@POST("v3/food")
|
||||
suspend fun createFood(@Body remoteFood: RemoteFood): Response<NSResponse<RemoteCreateUpdateResponse>>
|
||||
|
||||
@PUT("v3/food")
|
||||
suspend fun updateFood(@Body remoteFood: RemoteFood): Response<NSResponse<RemoteCreateUpdateResponse>>
|
||||
|
||||
}
|
||||
|
|
|
@ -18,6 +18,7 @@ data class LastModified(
|
|||
@SerializedName("devicestatus") var devicestatus: Long = 0, // devicestatus collection
|
||||
@SerializedName("entries") var entries: Long = 0, // entries collection
|
||||
@SerializedName("profile") var profile: Long = 0, // profile collection
|
||||
@SerializedName("treatments") var treatments: Long = 0 // treatments collection
|
||||
@SerializedName("treatments") var treatments: Long = 0, // treatments collection
|
||||
@SerializedName("foods") var foods: Long = 0 // foods collection
|
||||
)
|
||||
}
|
||||
|
|
|
@ -0,0 +1,41 @@
|
|||
package info.nightscout.sdk.remotemodel
|
||||
|
||||
import com.google.gson.annotations.SerializedName
|
||||
|
||||
/**
|
||||
* Depending on the type, different other fields are present.
|
||||
* Those technically need to be optional.
|
||||
*
|
||||
* On upload a sanity check still needs to be done to verify that all mandatory fields for that type are there.
|
||||
*
|
||||
**/
|
||||
internal data class RemoteFood(
|
||||
@SerializedName("type") val type: String, // we are interesting in type "food"
|
||||
@SerializedName("date") val date: Long?,
|
||||
@SerializedName("name") val name: String,
|
||||
@SerializedName("category") val category: String?,
|
||||
@SerializedName("subcategory") val subcategory: String?,
|
||||
@SerializedName("unit") val unit: String?,
|
||||
@SerializedName("portion") val portion: Double,
|
||||
@SerializedName("carbs") val carbs: Int,
|
||||
@SerializedName("gi") val gi: Int?,
|
||||
@SerializedName("energy") val energy: Int?,
|
||||
@SerializedName("protein") val protein: Int?,
|
||||
@SerializedName("fat") val fat: Int?,
|
||||
@SerializedName("identifier")
|
||||
val identifier: String?, // string Main addressing, required field that identifies document in the collection. The client should not create the identifier, the server automatically assigns it when the document is inserted.
|
||||
@SerializedName("isValid")
|
||||
val isValid: Boolean?, // A flag set by the server only for deleted documents. This field appears only within history operation and for documents which were deleted by API v3 (and they always have a false value)
|
||||
@SerializedName("isReadOnly")
|
||||
val isReadOnly: Boolean?, // A flag set by client that locks the document from any changes. Every document marked with isReadOnly=true is forever immutable and cannot even be deleted.
|
||||
@SerializedName("app") var app: String? = null, // Application or system in which the record was entered by human or device for the first time.
|
||||
@SerializedName("device") val device: String? = null, // string The device from which the data originated (including serial number of the device, if it is relevant and safe).
|
||||
@SerializedName("srvCreated")
|
||||
val srvCreated: Long? = null, // integer($int64) example: 1525383610088 The server's timestamp of document insertion into the database (Unix epoch in ms). This field appears only for documents which were inserted by API v3.
|
||||
@SerializedName("subject")
|
||||
val subject: String? = null, // string Name of the security subject (within Nightscout scope) which has created the document. This field is automatically set by the server from the passed token or JWT.
|
||||
@SerializedName("srvModified")
|
||||
val srvModified: Long? = null, // integer($int64) example: 1525383610088 The server's timestamp of the last document modification in the database (Unix epoch in ms). This field appears only for documents which were somehow modified by API v3 (inserted, updated or deleted).
|
||||
@SerializedName("modifiedBy")
|
||||
val modifiedBy: String? = null // string Name of the security subject (within Nightscout scope) which has patched or deleted the document for the last time. This field is automatically set by the server.
|
||||
)
|
|
@ -3,32 +3,33 @@ package info.nightscout.database.impl.transactions
|
|||
import info.nightscout.database.entities.Food
|
||||
|
||||
/**
|
||||
* Sync the TherapyEvents from NS
|
||||
* Sync the Foods from NS
|
||||
*/
|
||||
class SyncNsFoodTransaction(private val food: Food) : Transaction<SyncNsFoodTransaction.TransactionResult>() {
|
||||
class SyncNsFoodTransaction(private val foods: List<Food>) : Transaction<SyncNsFoodTransaction.TransactionResult>() {
|
||||
|
||||
override fun run(): TransactionResult {
|
||||
val result = TransactionResult()
|
||||
|
||||
val current: Food? =
|
||||
food.interfaceIDs.nightscoutId?.let {
|
||||
database.foodDao.findByNSId(it)
|
||||
}
|
||||
for (food in foods) {
|
||||
val current: Food? =
|
||||
food.interfaceIDs.nightscoutId?.let {
|
||||
database.foodDao.findByNSId(it)
|
||||
}
|
||||
|
||||
if (current != null) {
|
||||
// nsId exists, update if different
|
||||
if (!current.contentEqualsTo(food)) {
|
||||
current.copyFrom(food)
|
||||
database.foodDao.updateExistingEntry(current)
|
||||
if (food.isValid && current.isValid) result.updated.add(current)
|
||||
else if (!food.isValid && current.isValid) result.invalidated.add(current)
|
||||
if (current != null) {
|
||||
// nsId exists, update if different
|
||||
if (!current.contentEqualsTo(food)) {
|
||||
current.copyFrom(food)
|
||||
database.foodDao.updateExistingEntry(current)
|
||||
if (food.isValid && current.isValid) result.updated.add(current)
|
||||
else if (!food.isValid && current.isValid) result.invalidated.add(current)
|
||||
}
|
||||
} else {
|
||||
// not known nsId, add
|
||||
database.foodDao.insertNewEntry(food)
|
||||
result.inserted.add(food)
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// not known nsId, add
|
||||
database.foodDao.insertNewEntry(food)
|
||||
result.inserted.add(food)
|
||||
return result
|
||||
|
||||
}
|
||||
|
|
|
@ -41,7 +41,7 @@
|
|||
<string name="setupwizard_loop_description">Press the button below to enable AAPS to suggest/make basal changes</string>
|
||||
<string name="key_setupwizard_processed" translatable="false">startupwizard_processed</string>
|
||||
<string name="setupwizard_sensitivity_description">Sensitivity plugin is used for sensitivity detection and COB calculation. For more info visit:</string>
|
||||
<string name="setupwizard_sensitivity_url">https://androidaps.readthedocs.io/en/latest/Configuration/Sensitivity-detection-and-COB.html</string>
|
||||
<string name="setupwizard_sensitivity_url">https://wiki.aaps.app/en/latest/Configuration/Sensitivity-detection-and-COB.html</string>
|
||||
<string name="setupwizard_aps_description">Select one from availables algorithms. They are sorted from oldest to newest. Newer algorithm is usually more powerful and more aggressive. Thus if you are new looper you may probably start with AMA and not with latest one. Do not forget to read the OpenAPS documentation and configure it before use.</string>
|
||||
<string name="setupwizard_pump_waiting_for_riley_link_connection">Please configure your RileyLink below. After selecting a RileyLink, it will be possible to continue setup once the RileyLink status is \"Connected\". This might take a minute.\n</string>
|
||||
<string name="setupwizard_pump_pump_not_initialized"><b>Note:</b> You can continue setup once the pump has been set up.\n</string>
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
<string name="dia_label_exam">Duration of Insulin Action (DIA)</string>
|
||||
<string name="dia_profile">You should set the value for DIA in your profile.</string>
|
||||
<string name="dia_minimumis5h">The minimum allowed value is 5 hours.</string>
|
||||
<string name="dia_hint1">https://androidaps.readthedocs.io/en/latest/EN/Configuration/Config-Builder.html?#insulin</string>
|
||||
<string name="dia_hint1">https://wiki.aaps.app/en/latest/EN/Configuration/Config-Builder.html?#insulin</string>
|
||||
<string name="dia_meaningisequaltodiapump">If you are satisfied that the value for DIA that you used in your pump prior to AAPS worked well, there is no need to change this when you start looping.</string>
|
||||
<string name="dia_valuemustbedetermined">You should determine for yourself the appropriate value for DIA.</string>
|
||||
<string name="hypott_label">Hypo Temp-Target</string>
|
||||
|
@ -13,18 +13,18 @@
|
|||
<string name="hypott_preventoversmb">To prevent AAPS from overcorrecting for a blood glucose rise caused by the fast acting carbs used to treat a hypo.</string>
|
||||
<string name="hypott_exercise">To correct for a hypo induced as a result of exercise.</string>
|
||||
<string name="hypott_0basal">To prevent blood glucose from going low if there is already a 0% temporary basal rate running.</string>
|
||||
<string name="hypott_hint1">https://androidaps.readthedocs.io/en/latest/EN/Usage/temptarget.html</string>
|
||||
<string name="hypott_hint1">https://wiki.aaps.app/en/latest/EN/Usage/temptarget.html</string>
|
||||
<string name="offlineprofile_whatprofile">Which profile can be used and configured offline?</string>
|
||||
<string name="offlineprofile_label">Topic: Offline Profile</string>
|
||||
<string name="offlineprofile_nsprofile">NS Profile can be used, but not configured.</string>
|
||||
<string name="offlineprofile_hint1">https://androidaps.readthedocs.io/en/latest/EN/Configuration/Config-Builder.html#profile</string>
|
||||
<string name="offlineprofile_hint1">https://wiki.aaps.app/en/latest/EN/Configuration/Config-Builder.html#profile</string>
|
||||
<string name="pumpdisconnect_label">Reasons for applying "Disconnect pump" in AAPS</string>
|
||||
<string name="pumpdisconnect_whattodo">What should be done when disconnecting the pump?</string>
|
||||
<string name="pumpdisconnect_unnecessary">This is unnecessary as insulin will not be delivered if the pump is physically disconnected.</string>
|
||||
<string name="pumpdisconnect_missinginsulin">It prevents AAPS from accounting for insulin that was not delivered whilst the pump is physically disconnected. </string>
|
||||
<string name="pumpdisconnect_notstop">It will not stop insulin delivery if the pump remains connected.</string>
|
||||
<string name="pumpdisconnect_openloop">It will send AAPS into open loop mode.</string>
|
||||
<string name="pumpdisconnect_hint1">https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#other-settings</string>
|
||||
<string name="pumpdisconnect_hint1">https://wiki.aaps.app/en/latest/EN/Getting-Started/FAQ.html#other-settings</string>
|
||||
<string name="objectives_label">AAPS Settings</string>
|
||||
<string name="objectives2_label">AAPS Settings</string>
|
||||
<string name="objectives_howtosave">What are the best practices for backing up your settings?</string>
|
||||
|
@ -36,29 +36,29 @@
|
|||
<string name="objectives2_internalstorage">Your settings file is found in the folder Internal Storage/AAPS/preferences on your phone.</string>
|
||||
<string name="objectives2_cloud">Copy your preferences file to a safe location outside of your phone (e.g. by using a cloud drive, connecting a cable to a computer, email, etc.)</string>
|
||||
<string name="objectives2_easyrestore">If your phone is damaged or lost, there are easy ways to remotely recover your settings without a backup.</string>
|
||||
<string name="objectives_hint1">https://androidaps.readthedocs.io/en/latest/EN/Usage/ExportImportSettings.html</string>
|
||||
<string name="objectives_hint2">https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#what-emergency-equipment-is-recommended-to-take-with-me</string>
|
||||
<string name="objectives_hint1">https://wiki.aaps.app/en/latest/EN/Usage/ExportImportSettings.html</string>
|
||||
<string name="objectives_hint2">https://wiki.aaps.app/en/latest/EN/Getting-Started/FAQ.html#what-emergency-equipment-is-recommended-to-take-with-me</string>
|
||||
<string name="noisycgm_label">Noisy CGM Readings</string>
|
||||
<string name="noisycgm_whattodo">What should be done if CGM data is noisy?</string>
|
||||
<string name="noisycgm_nothing">Do nothing - AAPS will deal with it.</string>
|
||||
<string name="noisycgm_pause">Disable the closed loop to avoid possible over or underdosing.</string>
|
||||
<string name="noisycgm_replacesensor">Replace consistently noisy or inaccurate sensors.</string>
|
||||
<string name="noisycgm_checksmoothing">Verify that your CGM app provides smoothed data.</string>
|
||||
<string name="noisycgm_hint1">https://androidaps.readthedocs.io/en/latest/EN/Usage/Smoothing-Blood-Glucose-Data-in-xDrip.html#smoothing-blood-glucose-data</string>
|
||||
<string name="noisycgm_hint1">https://wiki.aaps.app/en/latest/EN/Usage/Smoothing-Blood-Glucose-Data-in-xDrip.html#smoothing-blood-glucose-data</string>
|
||||
<string name="exerciseprofile_label">Exercise and Profiles</string>
|
||||
<string name="exerciseprofile_whattodo">How can you use profiles to best help the system deal with aerobic exercise?</string>
|
||||
<string name="exerciseprofile_switchprofilebelow100">Do a profile switch to less than 100%.</string>
|
||||
<string name="exerciseprofile_switchprofileabove100">Do a profile switch to more than 100%.</string>
|
||||
<string name="exerciseprofile_leaveat100">Leave the profile set to 100%.</string>
|
||||
<string name="exerciseprofile_suspendloop">Suspend the loop.</string>
|
||||
<string name="exerciseprofile_hint1">https://androidaps.readthedocs.io/en/latest/EN/Usage/temptarget.html#activity-temp-target</string>
|
||||
<string name="exerciseprofile_hint1">https://wiki.aaps.app/en/latest/EN/Usage/temptarget.html#activity-temp-target</string>
|
||||
<string name="exercise_label">Exercise and Temporary Targets</string>
|
||||
<string name="exercise_whattodo">How can you use temporary targets to best help the system deal with aerobic exercise?</string>
|
||||
<string name="exercise_settt">Set an activity blood glucose target starting a suitable time before beginning exercise.</string>
|
||||
<string name="exercise_setfinished">Set an activity blood glucose target after finishing exercise.</string>
|
||||
<string name="exercise_setunchanged">Leave your blood glucose target unchanged.</string>
|
||||
<string name="exercise_15g">Wait until blood glucose drops below your hypo temp target and then eat 15 g of fast acting carbohydrates.</string>
|
||||
<string name="exercise_hint1">https://androidaps.readthedocs.io/en/latest/EN/Usage/temptarget.html#activity-temp-target</string>
|
||||
<string name="exercise_hint1">https://wiki.aaps.app/en/latest/EN/Usage/temptarget.html#activity-temp-target</string>
|
||||
<string name="suspendloop_doigetinsulin">Do I receive insulin when the loop is disabled/suspended?</string>
|
||||
<string name="suspendloop_yes">Yes, basal insulin continues to be delivered.</string>
|
||||
<string name="suspendloop_no">No, delivery of insulin is stopped.</string>
|
||||
|
@ -68,7 +68,7 @@
|
|||
<string name="basaltest_havingregularhighlow">When experiencing frequent high or low blood glucose.</string>
|
||||
<string name="basaltest_weekly">At least once per week.</string>
|
||||
<string name="basaltest_fixed">Once set and validated, these values should not change over time.</string>
|
||||
<string name="basaltest_hint1">https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#androidaps-settings</string>
|
||||
<string name="basaltest_hint1">https://wiki.aaps.app/en/latest/EN/Getting-Started/FAQ.html#androidaps-settings</string>
|
||||
<string name="prerequisites_label">Prerequisites</string>
|
||||
<string name="prerequisites_what">What is essential to set up and use AAPS?</string>
|
||||
<string name="prerequisites_determinedcorrectprofile">Validated profile information (Basal, IC, ISF, DIA).</string>
|
||||
|
@ -81,7 +81,7 @@
|
|||
<string name="prerequisites_githubaccount">A Github account.</string>
|
||||
<string name="prerequisites_beanandroiddeveloper">Experience in programming or editing code.</string>
|
||||
<string name="prerequisites_own670g">A MiniMed 670G pump.</string>
|
||||
<string name="prerequisites_hint1">https://androidaps.readthedocs.io/en/latest/EN/Module/module.html</string>
|
||||
<string name="prerequisites_hint1">https://wiki.aaps.app/en/latest/EN/Module/module.html</string>
|
||||
<string name="prerequisites_smartwatch">A Smartwatch.</string>
|
||||
<string name="prerequisites_supportedcgm">A Supported CGM.</string>
|
||||
<string name="prerequisites2_label">Prerequisites</string>
|
||||
|
@ -90,7 +90,7 @@
|
|||
<string name="prerequisites2_device">A compatible Android device (e.g. mobile/cell phone, full Android watch, or tablet).</string>
|
||||
<string name="prerequisites2_internet">AAPS requires an internet connection in order to run in closed loop.</string>
|
||||
<string name="prerequisites2_supportedcgm">A supported CGM and appropriate app to receive blood glucose values on the phone/device.</string>
|
||||
<string name="prerequisites2_hint1">https://androidaps.readthedocs.io/en/latest/EN/Module/module.html</string>
|
||||
<string name="prerequisites2_hint1">https://wiki.aaps.app/en/latest/EN/Module/module.html</string>
|
||||
<string name="update_label">Updating AAPS</string>
|
||||
<string name="whatistrue">Check all correct answers.</string>
|
||||
<string name="update_git">You need to have Git installed and configured on your computer.</string>
|
||||
|
@ -98,14 +98,14 @@
|
|||
<string name="update_keys">You should save and note the location of your keystore and use the same signing key for updates as for your previous installation.</string>
|
||||
<string name="update_neverupdate">Never update if the system is working well.</string>
|
||||
<string name="update_askfriend">If you have difficulty building the apk, you can install an apk that has been built by a friend.</string>
|
||||
<string name="update_hint1">https://androidaps.readthedocs.io/en/latest/EN/Installing-AndroidAPS/Update-to-new-version.html#update-to-a-new-version-or-branch</string>
|
||||
<string name="update_hint1">https://wiki.aaps.app/en/latest/EN/Installing-AndroidAPS/Update-to-new-version.html#update-to-a-new-version-or-branch</string>
|
||||
<string name="troubleshooting_label">Troubleshooting</string>
|
||||
<string name="troubleshooting_wheretoask">Where can you look for help with AAPS?</string>
|
||||
<string name="troubleshooting_fb">You can ask for advice in the AAPS Users Facebook group.</string>
|
||||
<string name="troubleshooting_wiki">You should read (and re-read) the AAPS documentation.</string>
|
||||
<string name="troubleshooting_gitter">You can ask for advice and log technical problems or issues in the AAPS Discord.</string>
|
||||
<string name="troubleshooting_yourendo">You should ask your diabetes clinic/endocrinologist.</string>
|
||||
<string name="troubleshooting_hint1">https://androidaps.readthedocs.io/en/latest/EN/Installing-AndroidAPS/Update-to-new-version.html#troubleshooting</string>
|
||||
<string name="troubleshooting_hint1">https://wiki.aaps.app/en/latest/EN/Installing-AndroidAPS/Update-to-new-version.html#troubleshooting</string>
|
||||
<string name="troubleshooting_hint2">https://www.facebook.com/groups/AndroidAPSUsers/</string>
|
||||
<string name="troubleshooting_hint3">https://discord.gg/4fQUWHZ4Mw</string>
|
||||
<string name="insulin_plugins">Insulin Plugins</string>
|
||||
|
@ -114,15 +114,15 @@
|
|||
<string name="insulin_novorapid">NovoRapid®/Novolog®</string>
|
||||
<string name="insulin_humalog">Humalog®</string>
|
||||
<string name="insulin_actrapid">Actrapid®/Humalin R®/"regular" human insulin.</string>
|
||||
<string name="insulin_hint1">https://androidaps.readthedocs.io/en/latest/EN/Configuration/Config-Builder.html#insulin</string>
|
||||
<string name="insulin_hint1">https://wiki.aaps.app/en/latest/EN/Configuration/Config-Builder.html#insulin</string>
|
||||
<string name="sensitivity_label">Sensitivity Plugins</string>
|
||||
<string name="sensitivity_which">Check all correct answers.</string>
|
||||
<string name="sensitivity_adjust">Sensitivity plugins allow AAPS to adjust for temporary or short-lived changes in insulin sensitivity (for example hormonal changes or issues with absorption at the infusion site).</string>
|
||||
<string name="sensitivity_edit">Sensitivity plugins provide the user with suggested changes to basal rates, I:C ratios and ISF that can be used to edit profile.</string>
|
||||
<string name="sensitivity_cannula">Logging a cannula change will reset Autosens ratio back to 100%.</string>
|
||||
<string name="sensitivity_time">Some of the plugin options have configurable time ranges that can be set by the user.</string>
|
||||
<string name="sensitivity_hint1">https://androidaps.readthedocs.io/en/latest/EN/Configuration/Sensitivity-detection-and-COB.html</string>
|
||||
<string name="sensitivity_hint2">https://androidaps.readthedocs.io/en/latest/Usage/Open-APS-features.html?highlight=Autosens#autosens</string>
|
||||
<string name="sensitivity_hint1">https://wiki.aaps.app/en/latest/EN/Configuration/Sensitivity-detection-and-COB.html</string>
|
||||
<string name="sensitivity_hint2">https://wiki.aaps.app/en/latest/Usage/Open-APS-features.html?highlight=Autosens#autosens</string>
|
||||
<string name="wrongcarbs_label">Carb Entry Errors</string>
|
||||
<string name="wrongcarbs_whattodo">What should you do if you’ve made an incorrect carb entry?</string>
|
||||
<string name="wrongcarbs_treatmentstab">Delete the incorrect entry in Treatments and enter the correct new carb value.</string>
|
||||
|
@ -157,29 +157,29 @@
|
|||
<string name="breadgrams_exchange">Carbohydrates consumed can be recorded using an appropriate exchange system (e.g. DAFNE "CHO" exchanges or European "Bread Units").</string>
|
||||
<string name="breadgrams_decay">AAPS uses a dynamic model to estimate carb “decay” and calculate COB.</string>
|
||||
<string name="breadgrams_calc">If blood glucose levels are outside acceptable values (too low or too high) the bolus calculator can be used to provide suggestions for carb or insulin corrections.</string>
|
||||
<string name="breadgrams_hint1">https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#insulin-to-carb-ratio-ic-g-u</string>
|
||||
<string name="breadgrams_hint1">https://wiki.aaps.app/en/latest/EN/Getting-Started/FAQ.html#insulin-to-carb-ratio-ic-g-u</string>
|
||||
<string name="extendedcarbs_label">e-carbs</string>
|
||||
<string name="extendedcarbs_handling">What could you use e-carbs (extended carbs) for?</string>
|
||||
<string name="extendedcarbs_future">To schedule carbs in the future, possibly distributed over an interval (similar to an extended bolus distributing insulin over an interval).</string>
|
||||
<string name="extendedcarbs_free">For logging \'free\' exercise carbs you want to hide from AAPS.</string>
|
||||
<string name="extendedcarbs_fat">e-carbs (distributed in the future) can assist AAPS in dealing with high fat/protein meals.</string>
|
||||
<string name="extendedcarbs_rescue">For logging rescue carbs you use to treat low blood glucose. </string>
|
||||
<string name="extendedcarbs_hint1">https://androidaps.readthedocs.io/en/latest/EN/Usage/Extended-Carbs.html</string>
|
||||
<string name="extendedcarbs_hint1">https://wiki.aaps.app/en/latest/EN/Usage/Extended-Carbs.html</string>
|
||||
<string name="nsclient_label">Remote Monitoring</string>
|
||||
<string name="nsclient_howcanyou">How can you monitor AAPS (for example for your child) remotely?</string>
|
||||
<string name="nsclient_nightscout">AAPSClient app, Nightscout app and Nightscout webpage all allow you to follow AAPS remotely.</string>
|
||||
<string name="nsclient_dexcomfollow">Other apps (e.g. Dexcom follow, xDrip running in follow mode) allow you to follow some parameters (e.g. blood glucose/sensor values) remotely, but use different algorithms so may have inaccurate IOB or COB values.</string>
|
||||
<string name="nsclient_data">To follow AAPS remotely, both devices must have internet access (e.g. via Wi-Fi or mobile/cellular network data).</string>
|
||||
<string name="nsclient_fullcontrol">AAPSClient used as a remote follower will both monitor and provide full control of AAPS.</string>
|
||||
<string name="nsclient_hint1">https://androidaps.readthedocs.io/en/latest/EN/Children/Children.html</string>
|
||||
<string name="nsclient_hint1">https://wiki.aaps.app/en/latest/EN/Children/Children.html</string>
|
||||
<string name="isf_label_exam">Insulin Sensitivity Factor (ISF)</string>
|
||||
<string name="isf_increasingvalue">Raising ISF values will lead to more insulin delivery to cover a specific amount of carbs.</string>
|
||||
<string name="isf_decreasingvalue">Reducing ISF values lead to more insulin delivery to correct for an above target blood glucose.</string>
|
||||
<string name="isf_noeffect">Raising or lowering ISF has no effect on insulin delivery when blood glucose levels are below target.</string>
|
||||
<string name="isf_preferences">ISF should be entered in your AAPS Preferences.</string>
|
||||
<string name="isf_profile">Changing the ISF value in your profile is enough to apply the change.</string>
|
||||
<string name="isf_hint1">https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#insulin-sensitivity-factor-isf-mmol-l-u-or-mg-dl-u</string>
|
||||
<string name="isf_hint2">https://androidaps.readthedocs.io/en/latest/EN/Usage/Profiles.html</string>
|
||||
<string name="isf_hint1">https://wiki.aaps.app/en/latest/EN/Getting-Started/FAQ.html#insulin-sensitivity-factor-isf-mmol-l-u-or-mg-dl-u</string>
|
||||
<string name="isf_hint2">https://wiki.aaps.app/en/latest/EN/Usage/Profiles.html</string>
|
||||
<string name="ic_multiple">You can use more than one value for I:C ratio in your profile.</string>
|
||||
<string name="ic_isf">If you change your ISF in your profile you should always change your I:C ratio too.</string>
|
||||
<string name="ic_label_exam">Insulin to Carbohydrate Ratio (I:C ratio)</string>
|
||||
|
@ -188,14 +188,14 @@
|
|||
<string name="ic_noeffect">If you have 0 COB, changing the IC ratio will lead to a different amount of insulin to correct a given BG value.</string>
|
||||
<string name="ic_different">IC will be different if you count bread (exchange) unit as 10g or 12g.</string>
|
||||
<string name="ic_meaning">IC meaning is: How many bread (exchange) units are covered by 1U of insulin.</string>
|
||||
<string name="ic_hint1">https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#carbohydrate-to-insulin-ratio-cr-g-u</string>
|
||||
<string name="ic_hint1">https://wiki.aaps.app/en/latest/EN/Getting-Started/FAQ.html#carbohydrate-to-insulin-ratio-cr-g-u</string>
|
||||
<string name="profileswitch_label">Profile Switching</string>
|
||||
<string name="profileswitch_pctwillchange"> When specifying a 90% profile switch, which answers are true?</string>
|
||||
<string name="profileswitch_basallower">Basal rates will be 10% lower.</string>
|
||||
<string name="profileswitch_isfhigher">ISF will be 10% higher.</string>
|
||||
<string name="profileswitch_iclower">The value of the I:C ratio will be a 10% lower number.</string>
|
||||
<string name="profileswitch_unchanged">ISF and I:C ratios will be unchanged.</string>
|
||||
<string name="profileswitch_hint1" formatted="false">https://androidaps.readthedocs.io/en/latest/EN/Usage/Profiles.html?highlight=profile%20switch#profile-switch</string>
|
||||
<string name="profileswitch_hint1" formatted="false">https://wiki.aaps.app/en/latest/EN/Usage/Profiles.html?highlight=profile%20switch#profile-switch</string>
|
||||
<string name="profileswitch2_label">Profile Switching</string>
|
||||
<string name="profileswitch2_pctwillchange"> When specifying a 120% profile switch, which answers are true?</string>
|
||||
<string name="profileswitch2_bghigher">Target blood glucose will be 20% higher.</string>
|
||||
|
@ -208,13 +208,13 @@
|
|||
<string name="profileswitchtime__2">Initiate a profile switch with a timeshift of -2</string>
|
||||
<string name="profileswitchtime_tt">Set an eating soon temporary target.</string>
|
||||
<string name="profileswitchtime_100">Do a profile switch to more than 100%. </string>
|
||||
<string name="profileswitchtime_hint1">https://androidaps.readthedocs.io/en/latest/EN/Usage/Profiles.html?highlight=profile%20switch#timeshift</string>
|
||||
<string name="profileswitchtime_hint1">https://wiki.aaps.app/en/latest/EN/Usage/Profiles.html?highlight=profile%20switch#timeshift</string>
|
||||
<string name="profileswitch4_label">Changes to profiles</string>
|
||||
<string name="profileswitch4_rates">Basal rates, ISF, I:C ratios, etc., should be set in profiles.</string>
|
||||
<string name="profileswitch4_internet">Activating changes to your Nightscout Profile requires your AAPS phone to have an internet connection.</string>
|
||||
<string name="profileswitch4_sufficient">Editing profiles to change values is sufficient to enact any changes made.</string>
|
||||
<string name="profileswitch4_multi">Multiple profiles can be set up and selected to accommodate changing circumstances (e.g. hormonal changes, shift working, weekdays/weekend lifestyle).</string>
|
||||
<string name="basalhelp_hint1">https://androidaps.readthedocs.io/en/latest/EN/Module/module.html#good-individual-dosage-algorithm-for-your-diabetes-therapy</string>
|
||||
<string name="basalhelp_hint1">https://wiki.aaps.app/en/latest/EN/Module/module.html#good-individual-dosage-algorithm-for-your-diabetes-therapy</string>
|
||||
<string name="basalhelp_label">Help with basal rates</string>
|
||||
<string name="basalhelp_where">Where to go for help with basalrate etc.</string>
|
||||
<string name="basalhelp_diabetesteam">Your diabetes team</string>
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
<string name="objectives_smb_gate">You must read the wiki and rise maxIOB to get SMBs working fine! A good start is maxIOB=average mealbolus + 3 x max daily basal</string>
|
||||
<string name="objectives_smb_learned">Using SMB is your goal. Oref1 algorithm was designed to help you with your boluses as well. You should not give full bolus for your food but only part of it and let AAPS give you the rest if needed. This way you have more space for miscalculated carbs. Did you know that you can set a percentage of bolus calculator result to reduce the size of bolus?</string>
|
||||
<string name="objectives_auto_objective">Enabling automation</string>
|
||||
<string name="objectives_auto_gate">Read the docs on how automation works. Set up your first simple rules. Instead of action let AAPS display only notification. When you are sure automation is triggered at the right time replace notification by real action. (https://androidaps.readthedocs.io/en/latest/EN/Usage/Automation.html)</string>
|
||||
<string name="objectives_auto_gate">Read the docs on how automation works. Set up your first simple rules. Instead of action let AAPS display only notification. When you are sure automation is triggered at the right time replace notification by real action. (https://wiki.aaps.app/en/latest/EN/Usage/Automation.html)</string>
|
||||
<string name="objectives_auto_learned">Automation can be a good servant but a bad master. Don\'t overuse it. Do not try to replace underlying algorithm. Test the rule with message only before use. It depends on order.</string>
|
||||
<string name="objectives_bgavailableinns">BG available in NS</string>
|
||||
<string name="objectives_pumpstatusavailableinns">Pump status available in NS</string>
|
||||
|
@ -76,10 +76,10 @@
|
|||
<string name="unfinshed_button">Next unfinished</string>
|
||||
<string name="requestcode">Request code: %1$s</string>
|
||||
<string name="objectives_hint">(check all correct answers)</string>
|
||||
<string name="disconnectpump_hint" formatted="false">https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#what-to-do-when-taking-a-shower-or-bath</string>
|
||||
<string name="usetemptarget_hint" formatted="false">https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/Screenshots.html#the-homescreen</string>
|
||||
<string name="useaction_hint" formatted="false">https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/Screenshots.html#config-builder</string>
|
||||
<string name="usescale_hint" formatted="false">https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/Screenshots.html#the-homescreen</string>
|
||||
<string name="disconnectpump_hint" formatted="false">https://wiki.aaps.app/en/latest/EN/Getting-Started/FAQ.html#what-to-do-when-taking-a-shower-or-bath</string>
|
||||
<string name="usetemptarget_hint" formatted="false">https://wiki.aaps.app/en/latest/EN/Getting-Started/Screenshots.html#the-homescreen</string>
|
||||
<string name="useaction_hint" formatted="false">https://wiki.aaps.app/en/latest/EN/Getting-Started/Screenshots.html#config-builder</string>
|
||||
<string name="usescale_hint" formatted="false">https://wiki.aaps.app/en/latest/EN/Getting-Started/Screenshots.html#the-homescreen</string>
|
||||
<string name="notconnected">Not connected to the internet</string>
|
||||
<string name="failedretrievetime">Failed retrieve time</string>
|
||||
<string name="requirementnotmet">Objective requirements not met</string>
|
||||
|
|
|
@ -3,12 +3,10 @@ package info.nightscout.plugins.di
|
|||
import dagger.Module
|
||||
import dagger.android.ContributesAndroidInjector
|
||||
import info.nightscout.plugins.general.food.FoodFragment
|
||||
import info.nightscout.plugins.general.food.FoodPlugin
|
||||
|
||||
@Module
|
||||
@Suppress("unused")
|
||||
abstract class FoodModule {
|
||||
|
||||
@ContributesAndroidInjector abstract fun contributesFoodFragment(): FoodFragment
|
||||
@ContributesAndroidInjector abstract fun contributesFoodWorker(): FoodPlugin.FoodWorker
|
||||
}
|
|
@ -1,25 +1,12 @@
|
|||
package info.nightscout.plugins.general.food
|
||||
|
||||
import android.content.Context
|
||||
import androidx.work.WorkerParameters
|
||||
import androidx.work.workDataOf
|
||||
import dagger.android.HasAndroidInjector
|
||||
import info.nightscout.core.extensions.foodFromJson
|
||||
import info.nightscout.core.utils.receivers.DataWorkerStorage
|
||||
import info.nightscout.core.utils.worker.LoggingWorker
|
||||
import info.nightscout.database.entities.Food
|
||||
import info.nightscout.database.impl.AppRepository
|
||||
import info.nightscout.database.impl.transactions.SyncNsFoodTransaction
|
||||
import info.nightscout.interfaces.plugin.PluginBase
|
||||
import info.nightscout.interfaces.plugin.PluginDescription
|
||||
import info.nightscout.interfaces.plugin.PluginType
|
||||
import info.nightscout.interfaces.utils.JsonHelper
|
||||
import info.nightscout.plugins.R
|
||||
import info.nightscout.rx.logging.AAPSLogger
|
||||
import info.nightscout.rx.logging.LTag
|
||||
import info.nightscout.shared.interfaces.ResourceHelper
|
||||
import info.nightscout.shared.sharedPreferences.SP
|
||||
import org.json.JSONObject
|
||||
import javax.inject.Inject
|
||||
import javax.inject.Singleton
|
||||
|
||||
|
@ -37,73 +24,4 @@ class FoodPlugin @Inject constructor(
|
|||
.shortName(R.string.food_short)
|
||||
.description(R.string.description_food),
|
||||
aapsLogger, rh, injector
|
||||
) {
|
||||
|
||||
// cannot be inner class because of needed injection
|
||||
class FoodWorker(
|
||||
context: Context,
|
||||
params: WorkerParameters
|
||||
) : LoggingWorker(context, params) {
|
||||
|
||||
@Inject lateinit var injector: HasAndroidInjector
|
||||
@Inject lateinit var repository: AppRepository
|
||||
@Inject lateinit var sp: SP
|
||||
@Inject lateinit var dataWorkerStorage: DataWorkerStorage
|
||||
|
||||
override fun doWorkAndLog(): Result {
|
||||
val foods = dataWorkerStorage.pickupJSONArray(inputData.getLong(DataWorkerStorage.STORE_KEY, -1))
|
||||
?: return Result.failure(workDataOf("Error" to "missing input data"))
|
||||
aapsLogger.debug(LTag.DATABASE, "Received Food Data: $foods")
|
||||
|
||||
var ret = Result.success()
|
||||
|
||||
for (index in 0 until foods.length()) {
|
||||
val jsonFood: JSONObject = foods.getJSONObject(index)
|
||||
|
||||
if (JsonHelper.safeGetString(jsonFood, "type") != "food") continue
|
||||
|
||||
when (JsonHelper.safeGetString(jsonFood, "action")) {
|
||||
"remove" -> {
|
||||
val delFood = Food(
|
||||
name = "",
|
||||
portion = 0.0,
|
||||
carbs = 0,
|
||||
isValid = false
|
||||
).also { it.interfaceIDs.nightscoutId = JsonHelper.safeGetString(jsonFood, "_id") }
|
||||
|
||||
repository.runTransactionForResult(SyncNsFoodTransaction(delFood))
|
||||
.doOnError {
|
||||
aapsLogger.error(LTag.DATABASE, "Error while removing food", it)
|
||||
ret = Result.failure(workDataOf("Error" to it.toString()))
|
||||
}
|
||||
.blockingGet()
|
||||
.also {
|
||||
it.invalidated.forEach { f -> aapsLogger.debug(LTag.DATABASE, "Invalidated food ${f.interfaceIDs.nightscoutId}") }
|
||||
}
|
||||
}
|
||||
|
||||
else -> {
|
||||
val food = foodFromJson(jsonFood)
|
||||
if (food != null) {
|
||||
repository.runTransactionForResult(SyncNsFoodTransaction(food))
|
||||
.doOnError {
|
||||
aapsLogger.error(LTag.DATABASE, "Error while adding/updating food", it)
|
||||
ret = Result.failure(workDataOf("Error" to it.toString()))
|
||||
}
|
||||
.blockingGet()
|
||||
.also { result ->
|
||||
result.inserted.forEach { aapsLogger.debug(LTag.DATABASE, "Inserted food $it") }
|
||||
result.updated.forEach { aapsLogger.debug(LTag.DATABASE, "Updated food $it") }
|
||||
result.invalidated.forEach { aapsLogger.debug(LTag.DATABASE, "Invalidated food $it") }
|
||||
}
|
||||
} else {
|
||||
aapsLogger.error(LTag.DATABASE, "Error parsing food", jsonFood.toString())
|
||||
ret = Result.failure(workDataOf("Error" to "Error parsing food"))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return ret
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
|
@ -152,8 +152,11 @@ class AutosensDataStoreObject : AutosensDataStore {
|
|||
}
|
||||
var diff = abs(someTime - referenceTime)
|
||||
diff %= T.mins(5).msecs()
|
||||
if (diff > T.mins(2).plus(T.secs(30)).msecs()) diff -= T.mins(5).msecs()
|
||||
return someTime + diff
|
||||
if (diff > T.mins(2).plus(T.secs(30)).msecs()){
|
||||
return someTime + abs(diff - T.mins(5).msecs()) // Adjust to the future
|
||||
} else {
|
||||
return someTime - diff // adjust to the past
|
||||
}
|
||||
}
|
||||
|
||||
fun isAbout5minData(aapsLogger: AAPSLogger): Boolean {
|
||||
|
@ -222,7 +225,7 @@ class AutosensDataStoreObject : AutosensDataStore {
|
|||
return
|
||||
}
|
||||
val newBucketedData = ArrayList<InMemoryGlucoseValue>()
|
||||
var currentTime = bgReadings[0].timestamp - bgReadings[0].timestamp % T.mins(5).msecs()
|
||||
var currentTime = bgReadings[0].timestamp
|
||||
val adjustedTime = adjustToReferenceTime(currentTime)
|
||||
// after adjusting time may be newer. In this case use T-5min
|
||||
currentTime = if (adjustedTime > currentTime) adjustedTime - T.mins(5).msecs() else adjustedTime
|
||||
|
|
|
@ -1150,6 +1150,177 @@ class AutosensDataStoreTest : TestBase() {
|
|||
Assertions.assertEquals(false, autosensDataStore.isAbout5minData(aapsLogger))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun createBucketedData5minTest3() {
|
||||
val bgReadingList: MutableList<GlucoseValue> = ArrayList()
|
||||
|
||||
// non 5min data not aligned to referenceTime should be recalculated to referenceTime
|
||||
autosensDataStore.referenceTime = T.mins(5).msecs()
|
||||
bgReadingList.clear()
|
||||
bgReadingList.add(
|
||||
GlucoseValue(
|
||||
raw = 0.0,
|
||||
noise = 0.0,
|
||||
value = 100.0,
|
||||
timestamp = T.mins(48).msecs(),
|
||||
sourceSensor = GlucoseValue.SourceSensor.UNKNOWN,
|
||||
trendArrow = GlucoseValue.TrendArrow.FLAT
|
||||
)
|
||||
)
|
||||
bgReadingList.add(
|
||||
GlucoseValue(
|
||||
raw = 0.0,
|
||||
noise = 0.0,
|
||||
value = 98.0,
|
||||
timestamp = T.mins(42).msecs(),
|
||||
sourceSensor = GlucoseValue.SourceSensor.UNKNOWN,
|
||||
trendArrow = GlucoseValue.TrendArrow.FLAT
|
||||
)
|
||||
)
|
||||
bgReadingList.add(
|
||||
GlucoseValue(
|
||||
raw = 0.0,
|
||||
noise = 0.0,
|
||||
value = 90.0,
|
||||
timestamp = T.mins(40).msecs(),
|
||||
sourceSensor = GlucoseValue.SourceSensor.UNKNOWN,
|
||||
trendArrow = GlucoseValue.TrendArrow.FLAT
|
||||
)
|
||||
)
|
||||
bgReadingList.add(
|
||||
GlucoseValue(
|
||||
raw = 0.0,
|
||||
noise = 0.0,
|
||||
value = 40.0,
|
||||
timestamp = T.mins(18).msecs(),
|
||||
sourceSensor = GlucoseValue.SourceSensor.UNKNOWN,
|
||||
trendArrow = GlucoseValue.TrendArrow.FLAT
|
||||
)
|
||||
)
|
||||
autosensDataStore.bgReadings = bgReadingList
|
||||
Assertions.assertEquals(false, autosensDataStore.isAbout5minData(aapsLogger))
|
||||
autosensDataStore.createBucketedData(aapsLogger, dateUtil)
|
||||
Assertions.assertEquals(T.mins(45).msecs(), autosensDataStore.bucketedData!![0].timestamp)
|
||||
Assertions.assertEquals(T.mins(35).msecs(), autosensDataStore.bucketedData!![2].timestamp)
|
||||
Assertions.assertEquals(T.mins(20).msecs(), autosensDataStore.bucketedData!![5].timestamp)
|
||||
Assertions.assertEquals(6, autosensDataStore.bucketedData!!.size.toLong())
|
||||
Assertions.assertEquals(99.0, autosensDataStore.bucketedData!![0].value, 1.0) // Recalculated data to 45min
|
||||
Assertions.assertEquals(90.0, autosensDataStore.bucketedData!![1].value, 1.0) // Recalculated data to 40min
|
||||
Assertions.assertEquals(67.0, autosensDataStore.bucketedData!![3].value, 1.0) // Recalculated data to 30min
|
||||
Assertions.assertEquals(45.0, autosensDataStore.bucketedData!![5].value, 1.0) // Recalculated data to 20min
|
||||
|
||||
// non 5min data not aligned to referenceTime should be recalculated to referenceTime
|
||||
autosensDataStore.referenceTime = T.mins(5).msecs()
|
||||
bgReadingList.clear()
|
||||
bgReadingList.add(
|
||||
GlucoseValue(
|
||||
raw = 0.0,
|
||||
noise = 0.0,
|
||||
value = 100.0,
|
||||
timestamp = T.mins(46).msecs(),
|
||||
sourceSensor = GlucoseValue.SourceSensor.UNKNOWN,
|
||||
trendArrow = GlucoseValue.TrendArrow.FLAT
|
||||
)
|
||||
)
|
||||
bgReadingList.add(
|
||||
GlucoseValue(
|
||||
raw = 0.0,
|
||||
noise = 0.0,
|
||||
value = 98.0,
|
||||
timestamp = T.mins(42).msecs(),
|
||||
sourceSensor = GlucoseValue.SourceSensor.UNKNOWN,
|
||||
trendArrow = GlucoseValue.TrendArrow.FLAT
|
||||
)
|
||||
)
|
||||
bgReadingList.add(
|
||||
GlucoseValue(
|
||||
raw = 0.0,
|
||||
noise = 0.0,
|
||||
value = 90.0,
|
||||
timestamp = T.mins(40).msecs(),
|
||||
sourceSensor = GlucoseValue.SourceSensor.UNKNOWN,
|
||||
trendArrow = GlucoseValue.TrendArrow.FLAT
|
||||
)
|
||||
)
|
||||
bgReadingList.add(
|
||||
GlucoseValue(
|
||||
raw = 0.0,
|
||||
noise = 0.0,
|
||||
value = 40.0,
|
||||
timestamp = T.mins(18).msecs(),
|
||||
sourceSensor = GlucoseValue.SourceSensor.UNKNOWN,
|
||||
trendArrow = GlucoseValue.TrendArrow.FLAT
|
||||
)
|
||||
)
|
||||
autosensDataStore.bgReadings = bgReadingList
|
||||
Assertions.assertEquals(false, autosensDataStore.isAbout5minData(aapsLogger))
|
||||
autosensDataStore.createBucketedData(aapsLogger, dateUtil)
|
||||
Assertions.assertEquals(T.mins(45).msecs(), autosensDataStore.bucketedData!![0].timestamp)
|
||||
Assertions.assertEquals(T.mins(35).msecs(), autosensDataStore.bucketedData!![2].timestamp)
|
||||
Assertions.assertEquals(T.mins(20).msecs(), autosensDataStore.bucketedData!![5].timestamp)
|
||||
Assertions.assertEquals(6, autosensDataStore.bucketedData!!.size.toLong())
|
||||
Assertions.assertEquals(99.0, autosensDataStore.bucketedData!![0].value, 1.0) // Recalculated data to 45min
|
||||
Assertions.assertEquals(90.0, autosensDataStore.bucketedData!![1].value, 1.0) // Recalculated data to 40min
|
||||
Assertions.assertEquals(67.0, autosensDataStore.bucketedData!![3].value, 1.0) // Recalculated data to 30min
|
||||
Assertions.assertEquals(45.0, autosensDataStore.bucketedData!![5].value, 1.0) // Recalculated data to 20min
|
||||
|
||||
// non 5min data without referenceTime set, should allign the data to the time of the last reading
|
||||
autosensDataStore.referenceTime = -1
|
||||
bgReadingList.clear()
|
||||
bgReadingList.add(
|
||||
GlucoseValue(
|
||||
raw = 0.0,
|
||||
noise = 0.0,
|
||||
value = 100.0,
|
||||
timestamp = T.mins(48).msecs(),
|
||||
sourceSensor = GlucoseValue.SourceSensor.UNKNOWN,
|
||||
trendArrow = GlucoseValue.TrendArrow.FLAT
|
||||
)
|
||||
)
|
||||
bgReadingList.add(
|
||||
GlucoseValue(
|
||||
raw = 0.0,
|
||||
noise = 0.0,
|
||||
value = 98.0,
|
||||
timestamp = T.mins(42).msecs(),
|
||||
sourceSensor = GlucoseValue.SourceSensor.UNKNOWN,
|
||||
trendArrow = GlucoseValue.TrendArrow.FLAT
|
||||
)
|
||||
)
|
||||
bgReadingList.add(
|
||||
GlucoseValue(
|
||||
raw = 0.0,
|
||||
noise = 0.0,
|
||||
value = 90.0,
|
||||
timestamp = T.mins(40).msecs(),
|
||||
sourceSensor = GlucoseValue.SourceSensor.UNKNOWN,
|
||||
trendArrow = GlucoseValue.TrendArrow.FLAT
|
||||
)
|
||||
)
|
||||
bgReadingList.add(
|
||||
GlucoseValue(
|
||||
raw = 0.0,
|
||||
noise = 0.0,
|
||||
value = 40.0,
|
||||
timestamp = T.mins(18).msecs(),
|
||||
sourceSensor = GlucoseValue.SourceSensor.UNKNOWN,
|
||||
trendArrow = GlucoseValue.TrendArrow.FLAT
|
||||
)
|
||||
)
|
||||
autosensDataStore.bgReadings = bgReadingList
|
||||
Assertions.assertEquals(false, autosensDataStore.isAbout5minData(aapsLogger))
|
||||
autosensDataStore.createBucketedData(aapsLogger, dateUtil)
|
||||
Assertions.assertEquals(T.mins(48).msecs(), autosensDataStore.bucketedData!![0].timestamp)
|
||||
Assertions.assertEquals(T.mins(43).msecs(), autosensDataStore.bucketedData!![1].timestamp)
|
||||
Assertions.assertEquals(T.mins(33).msecs(), autosensDataStore.bucketedData!![3].timestamp)
|
||||
Assertions.assertEquals(T.mins(18).msecs(), autosensDataStore.bucketedData!![6].timestamp)
|
||||
Assertions.assertEquals(7, autosensDataStore.bucketedData!!.size.toLong())
|
||||
Assertions.assertEquals(100.0, autosensDataStore.bucketedData!![0].value, 1.0) // Recalculated data to 48min
|
||||
Assertions.assertEquals(98.0, autosensDataStore.bucketedData!![1].value, 1.0) // Recalculated data to 43min
|
||||
Assertions.assertEquals(74.0, autosensDataStore.bucketedData!![3].value, 1.0) // Recalculated data to 33min
|
||||
Assertions.assertEquals(40.0, autosensDataStore.bucketedData!![6].value, 1.0) // Recalculated data to 18min
|
||||
}
|
||||
|
||||
@Test
|
||||
fun bgReadingsTest() {
|
||||
val bgReadingList: List<GlucoseValue> = ArrayList()
|
||||
|
|
|
@ -20,9 +20,11 @@ import info.nightscout.plugins.sync.nsclient.workers.NSClientUpdateRemoveAckWork
|
|||
import info.nightscout.plugins.sync.nsclientV3.workers.DataSyncWorker
|
||||
import info.nightscout.plugins.sync.nsclientV3.workers.LoadBgWorker
|
||||
import info.nightscout.plugins.sync.nsclientV3.workers.LoadDeviceStatusWorker
|
||||
import info.nightscout.plugins.sync.nsclientV3.workers.LoadFoodsWorker
|
||||
import info.nightscout.plugins.sync.nsclientV3.workers.LoadLastModificationWorker
|
||||
import info.nightscout.plugins.sync.nsclientV3.workers.LoadStatusWorker
|
||||
import info.nightscout.plugins.sync.nsclientV3.workers.LoadTreatmentsWorker
|
||||
import info.nightscout.plugins.sync.nsclientV3.workers.ProcessFoodWorker
|
||||
import info.nightscout.plugins.sync.nsclientV3.workers.ProcessTreatmentsWorker
|
||||
import info.nightscout.plugins.sync.tidepool.TidepoolFragment
|
||||
|
||||
|
@ -46,11 +48,14 @@ abstract class SyncModule {
|
|||
@ContributesAndroidInjector abstract fun contributesLoadStatusWorker(): LoadStatusWorker
|
||||
@ContributesAndroidInjector abstract fun contributesLoadLastModificationWorker(): LoadLastModificationWorker
|
||||
@ContributesAndroidInjector abstract fun contributesLoadBgWorker(): LoadBgWorker
|
||||
@ContributesAndroidInjector abstract fun contributesLoadFoodsWorker(): LoadFoodsWorker
|
||||
@ContributesAndroidInjector abstract fun contributesStoreBgWorker(): StoreDataForDbImpl.StoreBgWorker
|
||||
@ContributesAndroidInjector abstract fun contributesStoreFoodWorker(): StoreDataForDbImpl.StoreFoodWorker
|
||||
@ContributesAndroidInjector abstract fun contributesTreatmentWorker(): LoadTreatmentsWorker
|
||||
@ContributesAndroidInjector abstract fun contributesProcessTreatmentsWorker(): ProcessTreatmentsWorker
|
||||
@ContributesAndroidInjector abstract fun contributesLoadDeviceStatusWorker(): LoadDeviceStatusWorker
|
||||
@ContributesAndroidInjector abstract fun contributesDataSyncWorker(): DataSyncWorker
|
||||
@ContributesAndroidInjector abstract fun contributesFoodWorker(): ProcessFoodWorker
|
||||
|
||||
@ContributesAndroidInjector abstract fun contributesTidepoolFragment(): TidepoolFragment
|
||||
|
||||
|
|
|
@ -26,6 +26,7 @@ import info.nightscout.database.impl.transactions.SyncNsBolusTransaction
|
|||
import info.nightscout.database.impl.transactions.SyncNsCarbsTransaction
|
||||
import info.nightscout.database.impl.transactions.SyncNsEffectiveProfileSwitchTransaction
|
||||
import info.nightscout.database.impl.transactions.SyncNsExtendedBolusTransaction
|
||||
import info.nightscout.database.impl.transactions.SyncNsFoodTransaction
|
||||
import info.nightscout.database.impl.transactions.SyncNsOfflineEventTransaction
|
||||
import info.nightscout.database.impl.transactions.SyncNsProfileSwitchTransaction
|
||||
import info.nightscout.database.impl.transactions.SyncNsTemporaryBasalTransaction
|
||||
|
@ -92,11 +93,11 @@ class StoreDataForDbImpl @Inject constructor(
|
|||
override val temporaryBasals: MutableList<TemporaryBasal> = mutableListOf()
|
||||
override val profileSwitches: MutableList<ProfileSwitch> = mutableListOf()
|
||||
override val offlineEvents: MutableList<OfflineEvent> = mutableListOf()
|
||||
override val foods: MutableList<Food> = mutableListOf()
|
||||
|
||||
override val nsIdGlucoseValues: MutableList<GlucoseValue> = mutableListOf()
|
||||
override val nsIdBoluses: MutableList<Bolus> = mutableListOf()
|
||||
override val nsIdCarbs: MutableList<Carbs> = mutableListOf()
|
||||
override val nsIdFoods: MutableList<Food> = mutableListOf()
|
||||
override val nsIdTemporaryTargets: MutableList<TemporaryTarget> = mutableListOf()
|
||||
override val nsIdEffectiveProfileSwitches: MutableList<EffectiveProfileSwitch> = mutableListOf()
|
||||
override val nsIdBolusCalculatorResults: MutableList<BolusCalculatorResult> = mutableListOf()
|
||||
|
@ -106,6 +107,7 @@ class StoreDataForDbImpl @Inject constructor(
|
|||
override val nsIdProfileSwitches: MutableList<ProfileSwitch> = mutableListOf()
|
||||
override val nsIdOfflineEvents: MutableList<OfflineEvent> = mutableListOf()
|
||||
override val nsIdDeviceStatuses: MutableList<DeviceStatus> = mutableListOf()
|
||||
override val nsIdFoods: MutableList<Food> = mutableListOf()
|
||||
|
||||
private val userEntries: MutableList<UserEntry> = mutableListOf()
|
||||
|
||||
|
@ -131,6 +133,19 @@ class StoreDataForDbImpl @Inject constructor(
|
|||
}
|
||||
}
|
||||
|
||||
class StoreFoodWorker(
|
||||
context: Context,
|
||||
params: WorkerParameters
|
||||
) : LoggingWorker(context, params) {
|
||||
|
||||
@Inject lateinit var storeDataForDb: StoreDataForDb
|
||||
|
||||
override fun doWorkAndLog(): Result {
|
||||
storeDataForDb.storeFoodsToDb()
|
||||
return Result.success()
|
||||
}
|
||||
}
|
||||
|
||||
fun <T> HashMap<T, Long>.inc(key: T) =
|
||||
if (containsKey(key)) merge(key, 1, Long::plus)
|
||||
else put(key, 1)
|
||||
|
@ -171,6 +186,36 @@ class StoreDataForDbImpl @Inject constructor(
|
|||
rxBus.send(EventNSClientNewLog("DONE BG", ""))
|
||||
}
|
||||
|
||||
override fun storeFoodsToDb() {
|
||||
rxBus.send(EventNSClientNewLog("PROCESSING FOOD", ""))
|
||||
|
||||
if (foods.isNotEmpty())
|
||||
repository.runTransactionForResult(SyncNsFoodTransaction(foods))
|
||||
.doOnError {
|
||||
aapsLogger.error(LTag.DATABASE, "Error while saving foods", it)
|
||||
}
|
||||
.blockingGet()
|
||||
.also { result ->
|
||||
foods.clear()
|
||||
result.updated.forEach {
|
||||
aapsLogger.debug(LTag.DATABASE, "Updated food $it")
|
||||
updated.inc(Food::class.java.simpleName)
|
||||
}
|
||||
result.inserted.forEach {
|
||||
aapsLogger.debug(LTag.DATABASE, "Inserted food $it")
|
||||
inserted.inc(Food::class.java.simpleName)
|
||||
}
|
||||
result.invalidated.forEach {
|
||||
aapsLogger.debug(LTag.DATABASE, "Invalidated food $it")
|
||||
nsIdUpdated.inc(Food::class.java.simpleName)
|
||||
}
|
||||
}
|
||||
|
||||
sendLog("Food", Food::class.java.simpleName)
|
||||
SystemClock.sleep(pause)
|
||||
rxBus.send(EventNSClientNewLog("DONE FOOD", ""))
|
||||
}
|
||||
|
||||
override fun storeTreatmentsToDb() {
|
||||
rxBus.send(EventNSClientNewLog("PROCESSING TR", ""))
|
||||
|
||||
|
|
|
@ -1,18 +0,0 @@
|
|||
package info.nightscout.plugins.sync.nsShared.extensions
|
||||
|
||||
import info.nightscout.interfaces.pump.PumpEnactResult
|
||||
import info.nightscout.interfaces.utils.Round
|
||||
import org.json.JSONObject
|
||||
|
||||
fun PumpEnactResult.log(): String {
|
||||
return "Success: " + success +
|
||||
" Enacted: " + enacted +
|
||||
" Comment: " + comment +
|
||||
" Duration: " + duration +
|
||||
" Absolute: " + absolute +
|
||||
" Percent: " + percent +
|
||||
" IsPercent: " + isPercent +
|
||||
" IsTempCancel: " + isTempCancel +
|
||||
" bolusDelivered: " + bolusDelivered +
|
||||
" Queued: " + queued
|
||||
}
|
|
@ -41,7 +41,7 @@ import info.nightscout.plugins.sync.nsclient.data.AlarmAck
|
|||
import info.nightscout.plugins.sync.nsclient.data.NSDeviceStatusHandler
|
||||
import info.nightscout.plugins.sync.nsclient.workers.NSClientAddUpdateWorker
|
||||
import info.nightscout.plugins.sync.nsclient.workers.NSClientMbgWorker
|
||||
import info.nightscout.plugins.sync.nsclientV3.NSClientV3Plugin
|
||||
import info.nightscout.plugins.sync.nsclientV3.workers.ProcessFoodWorker
|
||||
import info.nightscout.rx.AapsSchedulers
|
||||
import info.nightscout.rx.bus.RxBus
|
||||
import info.nightscout.rx.events.EventAppExit
|
||||
|
@ -522,11 +522,14 @@ class NSClientService : DaggerService() {
|
|||
if (data.has("food")) {
|
||||
val foods = data.getJSONArray("food")
|
||||
if (foods.length() > 0) rxBus.send(EventNSClientNewLog("DATA", "received " + foods.length() + " foods"))
|
||||
dataWorkerStorage.enqueue(
|
||||
OneTimeWorkRequest.Builder(workerClasses.foodWorker)
|
||||
.setInputData(dataWorkerStorage.storeInputData(foods))
|
||||
.build()
|
||||
)
|
||||
dataWorkerStorage
|
||||
.beginUniqueWork(
|
||||
"ProcessFoods",
|
||||
OneTimeWorkRequest.Builder(ProcessFoodWorker::class.java)
|
||||
.setInputData(dataWorkerStorage.storeInputData(foods))
|
||||
.build()
|
||||
).then(OneTimeWorkRequest.Builder(StoreDataForDbImpl.StoreFoodWorker::class.java).build())
|
||||
.enqueue()
|
||||
}
|
||||
if (data.has("mbgs")) {
|
||||
val mbgArray = data.getJSONArray("mbgs")
|
||||
|
@ -550,7 +553,7 @@ class NSClientService : DaggerService() {
|
|||
sp.putBoolean(info.nightscout.core.utils.R.string.key_objectives_bg_is_available_in_ns, true)
|
||||
dataWorkerStorage
|
||||
.beginUniqueWork(
|
||||
NSClientV3Plugin.JOB_NAME,
|
||||
"ProcessBg",
|
||||
OneTimeWorkRequest.Builder(workerClasses.nsClientSourceWorker)
|
||||
.setInputData(dataWorkerStorage.storeInputData(sgvs))
|
||||
.build()
|
||||
|
|
|
@ -38,6 +38,7 @@ import info.nightscout.plugins.sync.nsclientV3.extensions.toNSBolus
|
|||
import info.nightscout.plugins.sync.nsclientV3.extensions.toNSBolusWizard
|
||||
import info.nightscout.plugins.sync.nsclientV3.extensions.toNSCarbs
|
||||
import info.nightscout.plugins.sync.nsclientV3.extensions.toNSEffectiveProfileSwitch
|
||||
import info.nightscout.plugins.sync.nsclientV3.extensions.toNSFood
|
||||
import info.nightscout.plugins.sync.nsclientV3.extensions.toNSProfileSwitch
|
||||
import info.nightscout.plugins.sync.nsclientV3.extensions.toNSTemporaryBasal
|
||||
import info.nightscout.plugins.sync.nsclientV3.extensions.toNSTemporaryTarget
|
||||
|
@ -293,6 +294,7 @@ class NSClientV3Plugin @Inject constructor(
|
|||
when (collection) {
|
||||
NsClient.Collection.ENTRIES -> lastLoadedSrvModified.collections.entries == 0L
|
||||
NsClient.Collection.TREATMENTS -> lastLoadedSrvModified.collections.treatments == 0L
|
||||
NsClient.Collection.FOODS -> lastLoadedSrvModified.collections.foods == 0L
|
||||
}
|
||||
|
||||
override fun updateLatestBgReceivedIfNewer(latestReceived: Long) {
|
||||
|
@ -321,35 +323,76 @@ class NSClientV3Plugin @Inject constructor(
|
|||
|
||||
private val gson: Gson = GsonBuilder().create()
|
||||
private fun dbOperation(collection: String, dataPair: DataSyncSelector.DataPair, progress: String, operation: Operation) {
|
||||
val call = when (operation) {
|
||||
Operation.CREATE -> nsAndroidClient?.let { return@let it::createTreatment }
|
||||
Operation.UPDATE -> nsAndroidClient?.let { return@let it::updateTreatment }
|
||||
}
|
||||
when (dataPair) {
|
||||
is DataSyncSelector.PairBolus -> dataPair.value.toNSBolus()
|
||||
is DataSyncSelector.PairCarbs -> dataPair.value.toNSCarbs()
|
||||
is DataSyncSelector.PairBolusCalculatorResult -> dataPair.value.toNSBolusWizard()
|
||||
is DataSyncSelector.PairTemporaryTarget -> dataPair.value.toNSTemporaryTarget()
|
||||
// is DataSyncSelector.PairFood -> dataPair.value.toJson(false)
|
||||
// is DataSyncSelector.PairGlucoseValue -> dataPair.value.toJson(false, dateUtil)
|
||||
is DataSyncSelector.PairTherapyEvent -> dataPair.value.toNSTherapyEvent()
|
||||
|
||||
is DataSyncSelector.PairTemporaryBasal -> {
|
||||
val profile = profileFunction.getProfile(dataPair.value.timestamp)
|
||||
if (profile == null) {
|
||||
dataSyncSelector.confirmLastTemporaryBasalIdIfGreater(dataPair.id)
|
||||
return
|
||||
}
|
||||
dataPair.value.toNSTemporaryBasal(profile)
|
||||
if (collection == "food") {
|
||||
val call = when (operation) {
|
||||
Operation.CREATE -> nsAndroidClient?.let { return@let it::createFood }
|
||||
Operation.UPDATE -> nsAndroidClient?.let { return@let it::updateFood }
|
||||
}
|
||||
// is DataSyncSelector.PairExtendedBolus -> dataPair.value.toJson(false, profileFunction.getProfile(dataPair.value.timestamp), dateUtil)
|
||||
is DataSyncSelector.PairProfileSwitch -> dataPair.value.toNSProfileSwitch(dateUtil)
|
||||
is DataSyncSelector.PairEffectiveProfileSwitch -> dataPair.value.toNSEffectiveProfileSwitch(dateUtil)
|
||||
// is DataSyncSelector.PairOfflineEvent -> dataPair.value.toJson(false, dateUtil)
|
||||
else -> null
|
||||
}?.let { data ->
|
||||
runBlocking {
|
||||
if (collection == "treatments") {
|
||||
when (dataPair) {
|
||||
is DataSyncSelector.PairFood -> dataPair.value.toNSFood()
|
||||
else -> null
|
||||
}?.let { data ->
|
||||
runBlocking {
|
||||
try {
|
||||
val id = if (dataPair.value is TraceableDBEntry) (dataPair.value as TraceableDBEntry).interfaceIDs.nightscoutId else ""
|
||||
rxBus.send(
|
||||
EventNSClientNewLog(
|
||||
when (operation) {
|
||||
Operation.CREATE -> "ADD $collection"
|
||||
Operation.UPDATE -> "UPDATE $collection"
|
||||
},
|
||||
when (operation) {
|
||||
Operation.CREATE -> "Sent ${dataPair.javaClass.simpleName} ${gson.toJson(data)} $progress"
|
||||
Operation.UPDATE -> "Sent ${dataPair.javaClass.simpleName} $id ${gson.toJson(data)} $progress"
|
||||
}
|
||||
)
|
||||
)
|
||||
call?.let { it(data) }?.let { result ->
|
||||
when (dataPair) {
|
||||
is DataSyncSelector.PairFood -> {
|
||||
if (result.response == 201) { // created
|
||||
dataPair.value.interfaceIDs.nightscoutId = result.identifier
|
||||
storeDataForDb.nsIdFoods.add(dataPair.value)
|
||||
storeDataForDb.scheduleNsIdUpdate()
|
||||
}
|
||||
dataSyncSelector.confirmLastFoodIdIfGreater(dataPair.id)
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
aapsLogger.error(LTag.NSCLIENT, "Upload exception", e)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (collection == "treatments") {
|
||||
val call = when (operation) {
|
||||
Operation.CREATE -> nsAndroidClient?.let { return@let it::createTreatment }
|
||||
Operation.UPDATE -> nsAndroidClient?.let { return@let it::updateTreatment }
|
||||
}
|
||||
when (dataPair) {
|
||||
is DataSyncSelector.PairBolus -> dataPair.value.toNSBolus()
|
||||
is DataSyncSelector.PairCarbs -> dataPair.value.toNSCarbs()
|
||||
is DataSyncSelector.PairBolusCalculatorResult -> dataPair.value.toNSBolusWizard()
|
||||
is DataSyncSelector.PairTemporaryTarget -> dataPair.value.toNSTemporaryTarget()
|
||||
// is DataSyncSelector.PairGlucoseValue -> dataPair.value.toJson(false, dateUtil)
|
||||
is DataSyncSelector.PairTherapyEvent -> dataPair.value.toNSTherapyEvent()
|
||||
|
||||
is DataSyncSelector.PairTemporaryBasal -> {
|
||||
val profile = profileFunction.getProfile(dataPair.value.timestamp)
|
||||
if (profile == null) {
|
||||
dataSyncSelector.confirmLastTemporaryBasalIdIfGreater(dataPair.id)
|
||||
return
|
||||
}
|
||||
dataPair.value.toNSTemporaryBasal(profile)
|
||||
}
|
||||
// is DataSyncSelector.PairExtendedBolus -> dataPair.value.toJson(false, profileFunction.getProfile(dataPair.value.timestamp), dateUtil)
|
||||
is DataSyncSelector.PairProfileSwitch -> dataPair.value.toNSProfileSwitch(dateUtil)
|
||||
is DataSyncSelector.PairEffectiveProfileSwitch -> dataPair.value.toNSEffectiveProfileSwitch(dateUtil)
|
||||
// is DataSyncSelector.PairOfflineEvent -> dataPair.value.toJson(false, dateUtil)
|
||||
else -> null
|
||||
}?.let { data ->
|
||||
runBlocking {
|
||||
try {
|
||||
val id = if (dataPair.value is TraceableDBEntry) (dataPair.value as TraceableDBEntry).interfaceIDs.nightscoutId else ""
|
||||
rxBus.send(
|
||||
|
@ -401,7 +444,6 @@ class NSClientV3Plugin @Inject constructor(
|
|||
}
|
||||
dataSyncSelector.confirmLastTempTargetsIdIfGreater(dataPair.id)
|
||||
}
|
||||
// is DataSyncSelector.PairFood -> dataPair.value.toJson(false)
|
||||
// is DataSyncSelector.PairGlucoseValue -> dataPair.value.toJson(false, dateUtil)
|
||||
is DataSyncSelector.PairTherapyEvent -> {
|
||||
if (result.response == 201) { // created
|
||||
|
@ -487,6 +529,7 @@ class NSClientV3Plugin @Inject constructor(
|
|||
.then(OneTimeWorkRequest.Builder(LoadBgWorker::class.java).build())
|
||||
// Other Workers are enqueued after BG finish
|
||||
// LoadTreatmentsWorker
|
||||
// LoadFoodsWorker
|
||||
// LoadDeviceStatusWorker
|
||||
// DataSyncWorker
|
||||
.enqueue()
|
||||
|
|
|
@ -0,0 +1,38 @@
|
|||
package info.nightscout.plugins.sync.nsclientV3.extensions
|
||||
|
||||
import info.nightscout.database.entities.Food
|
||||
import info.nightscout.database.entities.embedments.InterfaceIDs
|
||||
import info.nightscout.sdk.localmodel.food.NSFood
|
||||
|
||||
fun NSFood.toFood(): Food =
|
||||
Food(
|
||||
isValid = isValid,
|
||||
name = name,
|
||||
category = category,
|
||||
subCategory = subCategory,
|
||||
portion = portion,
|
||||
carbs = carbs,
|
||||
fat = fat,
|
||||
protein = protein,
|
||||
energy = energy,
|
||||
unit = unit,
|
||||
gi = gi,
|
||||
interfaceIDs_backing = InterfaceIDs(nightscoutId = identifier)
|
||||
)
|
||||
|
||||
fun Food.toNSFood(): NSFood =
|
||||
NSFood(
|
||||
date = System.currentTimeMillis(),
|
||||
isValid = isValid,
|
||||
name = name,
|
||||
category = category,
|
||||
subCategory = subCategory,
|
||||
portion = portion,
|
||||
carbs = carbs,
|
||||
fat = fat,
|
||||
protein = protein,
|
||||
energy = energy,
|
||||
unit = unit,
|
||||
gi = gi,
|
||||
identifier = interfaceIDs.nightscoutId,
|
||||
)
|
|
@ -0,0 +1,68 @@
|
|||
package info.nightscout.plugins.sync.nsclientV3.workers
|
||||
|
||||
import android.content.Context
|
||||
import androidx.work.ExistingWorkPolicy
|
||||
import androidx.work.OneTimeWorkRequest
|
||||
import androidx.work.WorkManager
|
||||
import androidx.work.WorkerParameters
|
||||
import androidx.work.workDataOf
|
||||
import info.nightscout.core.utils.receivers.DataWorkerStorage
|
||||
import info.nightscout.core.utils.worker.LoggingWorker
|
||||
import info.nightscout.interfaces.nsclient.StoreDataForDb
|
||||
import info.nightscout.interfaces.workflow.WorkerClasses
|
||||
import info.nightscout.plugins.sync.nsShared.StoreDataForDbImpl
|
||||
import info.nightscout.plugins.sync.nsclientV3.NSClientV3Plugin
|
||||
import info.nightscout.rx.bus.RxBus
|
||||
import info.nightscout.rx.events.EventNSClientNewLog
|
||||
import info.nightscout.sdk.localmodel.food.NSFood
|
||||
import info.nightscout.shared.utils.DateUtil
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import javax.inject.Inject
|
||||
|
||||
class LoadFoodsWorker(
|
||||
context: Context,
|
||||
params: WorkerParameters
|
||||
) : LoggingWorker(context, params) {
|
||||
|
||||
@Inject lateinit var dataWorkerStorage: DataWorkerStorage
|
||||
@Inject lateinit var rxBus: RxBus
|
||||
@Inject lateinit var context: Context
|
||||
@Inject lateinit var nsClientV3Plugin: NSClientV3Plugin
|
||||
@Inject lateinit var dateUtil: DateUtil
|
||||
@Inject lateinit var storeDataForDb: StoreDataForDb
|
||||
@Inject lateinit var workerClasses: WorkerClasses
|
||||
|
||||
override fun doWorkAndLog(): Result {
|
||||
val nsAndroidClient = nsClientV3Plugin.nsAndroidClient ?: return Result.failure(workDataOf("Error" to "AndroidClient is null"))
|
||||
|
||||
// Food database doesn't provide last record modification
|
||||
// Read full collection every 5th attempt
|
||||
runBlocking {
|
||||
if (nsClientV3Plugin.lastLoadedSrvModified.collections.foods++ % 5 == 0L) {
|
||||
val foods: List<NSFood> = nsAndroidClient.getFoods(1000)
|
||||
aapsLogger.debug("FOODS: $foods")
|
||||
rxBus.send(EventNSClientNewLog("RCV", "${foods.size} FOODs"))
|
||||
// Schedule processing of fetched data
|
||||
WorkManager.getInstance(context)
|
||||
.beginUniqueWork(
|
||||
NSClientV3Plugin.JOB_NAME,
|
||||
ExistingWorkPolicy.APPEND_OR_REPLACE,
|
||||
OneTimeWorkRequest.Builder(ProcessFoodWorker::class.java)
|
||||
.setInputData(dataWorkerStorage.storeInputData(foods))
|
||||
.build()
|
||||
).then(OneTimeWorkRequest.Builder(StoreDataForDbImpl.StoreFoodWorker::class.java).build())
|
||||
.then(OneTimeWorkRequest.Builder(LoadDeviceStatusWorker::class.java).build())
|
||||
.enqueue()
|
||||
} else {
|
||||
rxBus.send(EventNSClientNewLog("RCV", "FOOD skipped"))
|
||||
WorkManager.getInstance(context)
|
||||
.enqueueUniqueWork(
|
||||
NSClientV3Plugin.JOB_NAME,
|
||||
ExistingWorkPolicy.APPEND_OR_REPLACE,
|
||||
OneTimeWorkRequest.Builder(LoadDeviceStatusWorker::class.java).build()
|
||||
)
|
||||
}
|
||||
}
|
||||
return Result.success()
|
||||
}
|
||||
}
|
|
@ -46,7 +46,8 @@ class LoadTreatmentsWorker(
|
|||
val treatments: List<NSTreatment>
|
||||
val response: NSAndroidClient.ReadResponse<List<NSTreatment>>?
|
||||
if (isFirstLoad) {
|
||||
treatments = nsAndroidClient.getTreatmentsNewerThan(lastLoaded, 500)
|
||||
val lastLoadedIso = dateUtil.toISOString(lastLoaded)
|
||||
treatments = nsAndroidClient.getTreatmentsNewerThan(lastLoadedIso, 500)
|
||||
response = NSAndroidClient.ReadResponse(0, treatments)
|
||||
}
|
||||
else {
|
||||
|
@ -75,14 +76,13 @@ class LoadTreatmentsWorker(
|
|||
nsClientV3Plugin.lastLoadedSrvModified.collections.treatments = lastLoaded
|
||||
nsClientV3Plugin.storeLastFetched()
|
||||
}
|
||||
rxBus.send(EventNSClientNewLog("RCV END", "No TRs from ${dateUtil
|
||||
.dateAndTimeAndSecondsString(lastLoaded)}"))
|
||||
rxBus.send(EventNSClientNewLog("RCV END", "No TRs from ${dateUtil.dateAndTimeAndSecondsString(lastLoaded)}"))
|
||||
storeDataForDb.storeTreatmentsToDb()
|
||||
WorkManager.getInstance(context)
|
||||
.enqueueUniqueWork(
|
||||
NSClientV3Plugin.JOB_NAME,
|
||||
ExistingWorkPolicy.APPEND_OR_REPLACE,
|
||||
OneTimeWorkRequest.Builder(LoadDeviceStatusWorker::class.java).build()
|
||||
OneTimeWorkRequest.Builder(LoadFoodsWorker::class.java).build()
|
||||
)
|
||||
}
|
||||
} catch (error: Exception) {
|
||||
|
@ -95,14 +95,13 @@ class LoadTreatmentsWorker(
|
|||
nsClientV3Plugin.lastLoadedSrvModified.collections.treatments = lastLoaded
|
||||
nsClientV3Plugin.storeLastFetched()
|
||||
}
|
||||
rxBus.send(EventNSClientNewLog("RCV END", "No new TRs from ${dateUtil
|
||||
.dateAndTimeAndSecondsString(lastLoaded)}"))
|
||||
rxBus.send(EventNSClientNewLog("RCV END", "No new TRs from ${dateUtil.dateAndTimeAndSecondsString(lastLoaded)}"))
|
||||
storeDataForDb.storeTreatmentsToDb()
|
||||
WorkManager.getInstance(context)
|
||||
.enqueueUniqueWork(
|
||||
NSClientV3Plugin.JOB_NAME,
|
||||
ExistingWorkPolicy.APPEND_OR_REPLACE,
|
||||
OneTimeWorkRequest.Builder(LoadDeviceStatusWorker::class.java).build()
|
||||
OneTimeWorkRequest.Builder(LoadFoodsWorker::class.java).build()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,72 @@
|
|||
package info.nightscout.plugins.sync.nsclientV3.workers
|
||||
|
||||
import android.content.Context
|
||||
import androidx.work.WorkerParameters
|
||||
import androidx.work.workDataOf
|
||||
import dagger.android.HasAndroidInjector
|
||||
import info.nightscout.core.extensions.foodFromJson
|
||||
import info.nightscout.core.utils.receivers.DataWorkerStorage
|
||||
import info.nightscout.core.utils.worker.LoggingWorker
|
||||
import info.nightscout.database.entities.Food
|
||||
import info.nightscout.database.impl.AppRepository
|
||||
import info.nightscout.interfaces.nsclient.StoreDataForDb
|
||||
import info.nightscout.interfaces.utils.JsonHelper
|
||||
import info.nightscout.plugins.sync.nsclientV3.extensions.toFood
|
||||
import info.nightscout.rx.logging.LTag
|
||||
import info.nightscout.sdk.localmodel.food.NSFood
|
||||
import info.nightscout.shared.sharedPreferences.SP
|
||||
import org.json.JSONArray
|
||||
import org.json.JSONObject
|
||||
import javax.inject.Inject
|
||||
|
||||
class ProcessFoodWorker(
|
||||
context: Context,
|
||||
params: WorkerParameters
|
||||
) : LoggingWorker(context, params) {
|
||||
|
||||
@Inject lateinit var injector: HasAndroidInjector
|
||||
@Inject lateinit var repository: AppRepository
|
||||
@Inject lateinit var sp: SP
|
||||
@Inject lateinit var dataWorkerStorage: DataWorkerStorage
|
||||
@Inject lateinit var storeDataForDb: StoreDataForDb
|
||||
|
||||
override fun doWorkAndLog(): Result {
|
||||
val data = dataWorkerStorage.pickupObject(inputData.getLong(DataWorkerStorage.STORE_KEY, -1))
|
||||
?: return Result.failure(workDataOf("Error" to "missing input data"))
|
||||
aapsLogger.debug(LTag.DATABASE, "Received Food Data: $data")
|
||||
|
||||
val ret = Result.success()
|
||||
val foods = mutableListOf<Food>()
|
||||
|
||||
if (data is JSONArray) {
|
||||
for (index in 0 until data.length()) {
|
||||
val jsonFood: JSONObject = data.getJSONObject(index)
|
||||
|
||||
if (JsonHelper.safeGetString(jsonFood, "type") != "food") continue
|
||||
|
||||
when (JsonHelper.safeGetString(jsonFood, "action")) {
|
||||
"remove" -> {
|
||||
val delFood = Food(
|
||||
name = "",
|
||||
portion = 0.0,
|
||||
carbs = 0,
|
||||
isValid = false
|
||||
).also { it.interfaceIDs.nightscoutId = JsonHelper.safeGetString(jsonFood, "_id") }
|
||||
foods += delFood
|
||||
}
|
||||
|
||||
else -> {
|
||||
val food = foodFromJson(jsonFood)
|
||||
if (food != null) foods += food
|
||||
else aapsLogger.error(LTag.DATABASE, "Error parsing food", jsonFood.toString())
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (data is List<*>) {
|
||||
for (i in 0 until data.size)
|
||||
foods += (data[i] as NSFood).toFood()
|
||||
}
|
||||
storeDataForDb.foods.addAll(foods)
|
||||
return ret
|
||||
}
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
package info.nightscout.plugins.sync.nsclientV3.extensions
|
||||
|
||||
import info.nightscout.database.entities.Food
|
||||
import info.nightscout.database.entities.embedments.InterfaceIDs
|
||||
import info.nightscout.sdk.localmodel.food.NSFood
|
||||
import info.nightscout.sdk.mapper.convertToRemoteAndBack
|
||||
import org.junit.jupiter.api.Assertions
|
||||
import org.junit.jupiter.api.Test
|
||||
|
||||
@Suppress("SpellCheckingInspection")
|
||||
internal class FoodExtensionKtTest {
|
||||
|
||||
@Test
|
||||
fun toFood() {
|
||||
val food = Food(
|
||||
isValid = true,
|
||||
name = "name",
|
||||
category = "category",
|
||||
subCategory = "subcategory",
|
||||
portion = 2.0,
|
||||
carbs = 20,
|
||||
fat = 21,
|
||||
protein = 22,
|
||||
energy = 23,
|
||||
unit = "g",
|
||||
gi = 25,
|
||||
interfaceIDs_backing = InterfaceIDs(
|
||||
nightscoutId = "nightscoutId"
|
||||
)
|
||||
)
|
||||
|
||||
val food2 = (food.toNSFood().convertToRemoteAndBack() as NSFood).toFood()
|
||||
Assertions.assertTrue(food.contentEqualsTo(food2))
|
||||
Assertions.assertTrue(food.interfaceIdsEqualsTo(food2))
|
||||
}
|
||||
}
|
|
@ -46,7 +46,7 @@
|
|||
<string name="combo_error_failure_reading_changed_basal_rate">Basal rate changed on pump, but reading it failed</string>
|
||||
<string name="combo_activity_checking_for_history_changes">Checking for history changes</string>
|
||||
<string name="combo_error_multiple_boluses_with_identical_timestamp">Multiple boluses with the same amount within the same minute were just imported. Only one record could be added to treatments. Please check the pump and manually add a bolus record using the Careportal tab. Make sure to create a bolus with a time no other bolus uses.</string>
|
||||
<string name="about_link_urls">\n\ndocumentation:\nhttps://androidaps.readthedocs.io\n\nfacebook:\nhttps://www.facebook.com/groups/AndroidAPSUsers</string>
|
||||
<string name="about_link_urls">\n\ndocumentation:\nhttps://wiki.aaps.app\n\nfacebook:\nhttps://www.facebook.com/groups/AndroidAPSUsers</string>
|
||||
<string name="combo_check_date">The last bolus is older than 24 hours or is in the future. Please check the date on the pump is set correctly.</string>
|
||||
<string name="combo_suspious_bolus_time">Time/date of the delivered bolus on pump seems wrong, IOB is likely incorrect. Please check pump time/date.</string>
|
||||
<string name="combo_bolus_count">Bolus count</string>
|
||||
|
|
|
@ -41,6 +41,7 @@ class ComboV2Fragment : DaggerFragment() {
|
|||
|
||||
binding.combov2RefreshButton.setOnClickListener {
|
||||
binding.combov2RefreshButton.isEnabled = false
|
||||
combov2Plugin.clearPumpErrorObservedFlag()
|
||||
commandQueue.readStatus(rh.gs(info.nightscout.core.ui.R.string.user_request), null)
|
||||
}
|
||||
|
||||
|
|
|
@ -25,6 +25,8 @@ import info.nightscout.comboctl.parser.BatteryState
|
|||
import info.nightscout.comboctl.parser.ReservoirState
|
||||
import info.nightscout.core.ui.dialogs.OKDialog
|
||||
import info.nightscout.core.ui.toast.ToastUtils
|
||||
import info.nightscout.interfaces.AndroidPermission
|
||||
import info.nightscout.interfaces.Config
|
||||
import info.nightscout.interfaces.constraints.Constraint
|
||||
import info.nightscout.interfaces.constraints.Constraints
|
||||
import info.nightscout.interfaces.notifications.Notification
|
||||
|
@ -95,6 +97,8 @@ import info.nightscout.comboctl.base.Tbr as ComboCtlTbr
|
|||
import info.nightscout.comboctl.main.Pump as ComboCtlPump
|
||||
import info.nightscout.comboctl.main.PumpManager as ComboCtlPumpManager
|
||||
|
||||
internal const val PUMP_ERROR_TIMEOUT_INTERVAL_MSECS = 1000L * 60 * 5
|
||||
|
||||
@Singleton
|
||||
class ComboV2Plugin @Inject constructor (
|
||||
injector: HasAndroidInjector,
|
||||
|
@ -107,7 +111,9 @@ class ComboV2Plugin @Inject constructor (
|
|||
private val sp: SP,
|
||||
private val pumpSync: PumpSync,
|
||||
private val dateUtil: DateUtil,
|
||||
private val uiInteraction: UiInteraction
|
||||
private val uiInteraction: UiInteraction,
|
||||
private val androidPermission: AndroidPermission,
|
||||
private val config: Config
|
||||
) :
|
||||
PumpPluginBase(
|
||||
PluginDescription()
|
||||
|
@ -161,6 +167,13 @@ class ComboV2Plugin @Inject constructor (
|
|||
private var lastConnectionTimestamp = 0L
|
||||
private var lastComboAlert: AlertScreenContent? = null
|
||||
|
||||
// States for when the pump reports an error. We then want isInitialized()
|
||||
// to return false until either the user presses the Refresh button or the
|
||||
// pumpErrorTimeoutJob expires. That way, the loop won't run until then,
|
||||
// giving the user a chance to handle the error.
|
||||
private var pumpErrorObserved = false
|
||||
private var pumpErrorTimeoutJob: Job? = null
|
||||
|
||||
// Set to true if a disconnect request came in while the driver
|
||||
// was in the Connecting, CheckingPump, or ExecutingCommand
|
||||
// state (in other words, while isBusy() was returning true).
|
||||
|
@ -183,7 +196,7 @@ class ComboV2Plugin @Inject constructor (
|
|||
private var activeBasalProfile: BasalProfile? = null
|
||||
// This is used for checking that the correct basal profile is
|
||||
// active in the Combo. If not, loop invocation is disallowed.
|
||||
// This is _not_ reset by disconect(). That's on purpose; it
|
||||
// This is _not_ reset by disconnect(). That's on purpose; it
|
||||
// is read by isLoopInvocationAllowed(), which is called even
|
||||
// if the pump is not connected.
|
||||
private var lastActiveBasalProfileNumber: Int? = null
|
||||
|
@ -277,32 +290,46 @@ class ComboV2Plugin @Inject constructor (
|
|||
aapsLogger.debug(LTag.PUMP, "Creating bluetooth interface")
|
||||
bluetoothInterface = AndroidBluetoothInterface(context)
|
||||
|
||||
aapsLogger.debug(LTag.PUMP, "Setting up bluetooth interface")
|
||||
bluetoothInterface!!.setup()
|
||||
// Continue initialization in a separate coroutine. This allows us to call
|
||||
// runWithPermissionCheck(), which will keep trying to run the code block
|
||||
// until either the necessary Bluetooth permissios are granted, or the
|
||||
// coroutine is cancelled (see onStop() below).
|
||||
pumpCoroutineScope.launch {
|
||||
runWithPermissionCheck(
|
||||
context, config, aapsLogger, androidPermission,
|
||||
permissionsToCheckFor = listOf("android.permission.BLUETOOTH_CONNECT")
|
||||
) {
|
||||
aapsLogger.debug(LTag.PUMP, "Setting up bluetooth interface")
|
||||
bluetoothInterface!!.setup()
|
||||
|
||||
aapsLogger.debug(LTag.PUMP, "Setting up pump manager")
|
||||
pumpManager = ComboCtlPumpManager(bluetoothInterface!!, pumpStateStore)
|
||||
pumpManager!!.setup {
|
||||
_pairedStateUIFlow.value = false
|
||||
unpairing = false
|
||||
aapsLogger.debug(LTag.PUMP, "Setting up pump manager")
|
||||
pumpManager = ComboCtlPumpManager(bluetoothInterface!!, pumpStateStore)
|
||||
pumpManager!!.setup {
|
||||
_pairedStateUIFlow.value = false
|
||||
unpairing = false
|
||||
}
|
||||
|
||||
// UI flows that must have defined values right
|
||||
// at start are initialized here.
|
||||
|
||||
// The paired state UI flow is special in that it is also
|
||||
// used as the backing store for the isPaired() function,
|
||||
// so setting up that UI state flow equals updating that
|
||||
// paired state.
|
||||
val paired = pumpManager!!.getPairedPumpAddresses().isNotEmpty()
|
||||
_pairedStateUIFlow.value = paired
|
||||
|
||||
setDriverState(DriverState.Disconnected)
|
||||
|
||||
// NOTE: EventInitializationChanged is sent in getPumpStatus() .
|
||||
}
|
||||
}
|
||||
|
||||
// UI flows that must have defined values right
|
||||
// at start are initialized here.
|
||||
|
||||
// The paired state UI flow is special in that it is also
|
||||
// used as the backing store for the isPaired() function,
|
||||
// so setting up that UI state flow equals updating that
|
||||
// paired state.
|
||||
val paired = pumpManager!!.getPairedPumpAddresses().isNotEmpty()
|
||||
_pairedStateUIFlow.value = paired
|
||||
|
||||
setDriverState(DriverState.Disconnected)
|
||||
|
||||
// NOTE: EventInitializationChanged is sent in getPumpStatus() .
|
||||
}
|
||||
|
||||
override fun onStop() {
|
||||
// Cancel any ongoing background coroutines. This includes an ongoing
|
||||
// unfinished initialization that still waits for the user to grant
|
||||
// Bluetooth permissions.
|
||||
pumpCoroutineScope.cancel()
|
||||
|
||||
runBlocking {
|
||||
|
@ -381,7 +408,7 @@ class ComboV2Plugin @Inject constructor (
|
|||
}
|
||||
|
||||
override fun isInitialized(): Boolean =
|
||||
isPaired() && (driverStateFlow.value != DriverState.NotInitialized)
|
||||
isPaired() && (driverStateFlow.value != DriverState.NotInitialized) && !pumpErrorObserved
|
||||
|
||||
override fun isSuspended(): Boolean =
|
||||
when (driverStateUIFlow.value) {
|
||||
|
@ -432,6 +459,16 @@ class ComboV2Plugin @Inject constructor (
|
|||
return
|
||||
}
|
||||
|
||||
if (pumpErrorObserved) {
|
||||
aapsLogger.debug(LTag.PUMP, "Aborting connect attempt since the pumpErrorObserved flag is set")
|
||||
uiInteraction.addNotification(
|
||||
Notification.COMBO_PUMP_ALARM,
|
||||
text = rh.gs(R.string.combov2_cannot_connect_pump_error_observed),
|
||||
level = Notification.NORMAL
|
||||
)
|
||||
return
|
||||
}
|
||||
|
||||
when (driverStateFlow.value) {
|
||||
DriverState.Connecting,
|
||||
DriverState.CheckingPump,
|
||||
|
@ -561,10 +598,15 @@ class ComboV2Plugin @Inject constructor (
|
|||
var forciblyDisconnectDueToError = false
|
||||
|
||||
try {
|
||||
// Set maxNumAttempts to null to turn off the connection attempt limit inside the connect() call.
|
||||
// The AAPS queue thread will anyway cause the connectionSetupJob to be canceled when its
|
||||
// connection timeout expires, so the Pump class' own connection attempt limiter is redundant.
|
||||
pump?.connect(maxNumAttempts = null)
|
||||
runWithPermissionCheck(
|
||||
context, config, aapsLogger, androidPermission,
|
||||
permissionsToCheckFor = listOf("android.permission.BLUETOOTH_CONNECT")
|
||||
) {
|
||||
// Set maxNumAttempts to null to turn off the connection attempt limit inside the connect() call.
|
||||
// The AAPS queue thread will anyway cause the connectionSetupJob to be canceled when its
|
||||
// connection timeout expires, so the Pump class' own connection attempt limiter is redundant.
|
||||
pump?.connect(maxNumAttempts = null)
|
||||
}
|
||||
|
||||
// No need to set the driver state here, since the pump's stateFlow will announce that.
|
||||
|
||||
|
@ -744,17 +786,25 @@ class ComboV2Plugin @Inject constructor (
|
|||
Notification.INFO,
|
||||
60
|
||||
)
|
||||
|
||||
pumpEnactResult.apply {
|
||||
success = true
|
||||
enacted = true
|
||||
}
|
||||
} else {
|
||||
aapsLogger.debug(LTag.PUMP, "Basal profiles are equal; did not have to set anything")
|
||||
pumpEnactResult.apply {
|
||||
success = true
|
||||
enacted = false
|
||||
}
|
||||
// Treat this as if the command had been enacted. Setting a basal profile is
|
||||
// an idempotent operation, meaning that setting the exact same profile factors
|
||||
// twice in a row does not actually change anything. Therefore, we can just
|
||||
// completely skip such a redundant set basal profile operation and still get
|
||||
// the exact same result.
|
||||
// Furthermore, it is actually important to also set enacted to true in this case
|
||||
// because even though this _driver_ might know that the Combo uses this profile
|
||||
// already, _AAPS_ might not. A good example is when AAPS is set up the first time
|
||||
// and no profile has been activated. If in this case the profile happens to be
|
||||
// identical to what's already in the Combo, then enacted=false would cause errors,
|
||||
// because AAPS expects the driver to always enact the profile change in this case
|
||||
// (since it thinks that no profile is set yet).
|
||||
}
|
||||
|
||||
pumpEnactResult.apply {
|
||||
success = true
|
||||
enacted = true
|
||||
}
|
||||
}
|
||||
} catch (e: CancellationException) {
|
||||
|
@ -1398,6 +1448,14 @@ class ComboV2Plugin @Inject constructor (
|
|||
commandQueue.readStatus(reason, null)
|
||||
}
|
||||
|
||||
fun clearPumpErrorObservedFlag() {
|
||||
stopPumpErrorTimeout()
|
||||
if (pumpErrorObserved) {
|
||||
aapsLogger.info(LTag.PUMP, "Clearing pumpErrorObserved flag")
|
||||
pumpErrorObserved = false
|
||||
}
|
||||
}
|
||||
|
||||
/*** Loop constraints ***/
|
||||
// These restrict the function of the loop in case of an event
|
||||
// that makes running a loop too risky, for example because something
|
||||
|
@ -1459,15 +1517,22 @@ class ComboV2Plugin @Inject constructor (
|
|||
|
||||
pairingJob = pumpCoroutineScope.async {
|
||||
try {
|
||||
val pairingResult = pumpManager?.pairWithNewPump(discoveryDuration) { newPumpAddress, previousAttemptFailed ->
|
||||
aapsLogger.info(
|
||||
LTag.PUMP,
|
||||
"New pairing PIN request from Combo pump with Bluetooth " +
|
||||
"address $newPumpAddress (previous attempt failed: $previousAttemptFailed)"
|
||||
)
|
||||
_previousPairingAttemptFailedFlow.value = previousAttemptFailed
|
||||
newPINChannel.receive()
|
||||
} ?: throw IllegalStateException("Attempting to access uninitialized pump manager")
|
||||
// Do the pairing attempt within runWithPermissionCheck()
|
||||
// since pairing requires Bluetooth permissions.
|
||||
val pairingResult = runWithPermissionCheck(
|
||||
context, config, aapsLogger, androidPermission,
|
||||
permissionsToCheckFor = listOf("android.permission.BLUETOOTH_CONNECT")
|
||||
) {
|
||||
pumpManager?.pairWithNewPump(discoveryDuration) { newPumpAddress, previousAttemptFailed ->
|
||||
aapsLogger.info(
|
||||
LTag.PUMP,
|
||||
"New pairing PIN request from Combo pump with Bluetooth " +
|
||||
"address $newPumpAddress (previous attempt failed: $previousAttemptFailed)"
|
||||
)
|
||||
_previousPairingAttemptFailedFlow.value = previousAttemptFailed
|
||||
newPINChannel.receive()
|
||||
} ?: throw IllegalStateException("Attempting to access uninitialized pump manager")
|
||||
}
|
||||
|
||||
if (pairingResult !is ComboCtlPumpManager.PairingResult.Success)
|
||||
return@async
|
||||
|
@ -1550,6 +1615,8 @@ class ComboV2Plugin @Inject constructor (
|
|||
_serialNumberUIFlow.value = ""
|
||||
_bluetoothAddressUIFlow.value = ""
|
||||
|
||||
clearPumpErrorObservedFlag()
|
||||
|
||||
// The unpairing variable is set to false in
|
||||
// the PumpManager onPumpUnpaired callback.
|
||||
}
|
||||
|
@ -1748,6 +1815,23 @@ class ComboV2Plugin @Inject constructor (
|
|||
}
|
||||
}
|
||||
|
||||
private fun startPumpErrorTimeout() {
|
||||
if (pumpErrorTimeoutJob != null)
|
||||
return
|
||||
|
||||
pumpErrorTimeoutJob = pumpCoroutineScope.launch {
|
||||
delay(PUMP_ERROR_TIMEOUT_INTERVAL_MSECS)
|
||||
aapsLogger.info(LTag.PUMP, "Clearing pumpErrorObserved flag after timeout was reached")
|
||||
pumpErrorObserved = false
|
||||
commandQueue.readStatus(rh.gs(R.string.combov2_refresh_pump_status_after_error), null)
|
||||
}
|
||||
}
|
||||
|
||||
private fun stopPumpErrorTimeout() {
|
||||
pumpErrorTimeoutJob?.cancel()
|
||||
pumpErrorTimeoutJob = null
|
||||
}
|
||||
|
||||
private fun updateBaseBasalRateUI() {
|
||||
val currentHour = DateTime().hourOfDay().get()
|
||||
// This sets value to null if no profile is set,
|
||||
|
@ -2142,6 +2226,12 @@ class ComboV2Plugin @Inject constructor (
|
|||
}
|
||||
|
||||
private fun notifyAboutComboAlert(alert: AlertScreenContent) {
|
||||
if (alert is AlertScreenContent.Error) {
|
||||
aapsLogger.info(LTag.PUMP, "Error screen observed - setting pumpErrorObserved flag")
|
||||
pumpErrorObserved = true
|
||||
startPumpErrorTimeout()
|
||||
}
|
||||
|
||||
uiInteraction.addNotification(
|
||||
Notification.COMBO_PUMP_ALARM,
|
||||
text = "${rh.gs(R.string.combov2_combo_alert)}: ${getAlertDescription(alert)}",
|
||||
|
|
|
@ -1,8 +1,16 @@
|
|||
package info.nightscout.pump.combov2
|
||||
|
||||
import android.content.Context
|
||||
import android.os.Build
|
||||
import info.nightscout.comboctl.android.AndroidBluetoothPermissionException
|
||||
import info.nightscout.comboctl.main.BasalProfile
|
||||
import info.nightscout.comboctl.main.NUM_COMBO_BASAL_PROFILE_FACTORS
|
||||
import info.nightscout.interfaces.AndroidPermission
|
||||
import info.nightscout.interfaces.Config
|
||||
import info.nightscout.interfaces.profile.Profile as AAPSProfile
|
||||
import info.nightscout.rx.logging.AAPSLogger
|
||||
import info.nightscout.rx.logging.LTag
|
||||
import kotlinx.coroutines.delay
|
||||
|
||||
// Utility extension functions for clearer conversion between
|
||||
// ComboCtl units and AAPS units. ComboCtl uses integer-encoded
|
||||
|
@ -23,3 +31,36 @@ fun AAPSProfile.toComboCtlBasalProfile(): BasalProfile {
|
|||
}
|
||||
return BasalProfile(factors)
|
||||
}
|
||||
|
||||
suspend fun <T> runWithPermissionCheck(
|
||||
context: Context,
|
||||
config: Config,
|
||||
aapsLogger: AAPSLogger,
|
||||
androidPermission: AndroidPermission,
|
||||
permissionsToCheckFor: Collection<String>,
|
||||
block: suspend () -> T
|
||||
): T {
|
||||
var permissions = permissionsToCheckFor
|
||||
while (true) {
|
||||
try {
|
||||
if (config.PUMPDRIVERS && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
||||
val notAllPermissionsGranted = permissions.fold(initial = false) { currentResult, permission ->
|
||||
return@fold if (androidPermission.permissionNotGranted(context, permission)) {
|
||||
aapsLogger.debug(LTag.PUMP, "permission $permission was not granted by the user")
|
||||
true
|
||||
} else
|
||||
currentResult
|
||||
}
|
||||
|
||||
if (notAllPermissionsGranted) {
|
||||
delay(1000) // Wait a little bit before retrying to avoid 100% CPU usage
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
return block.invoke()
|
||||
} catch (e: AndroidBluetoothPermissionException) {
|
||||
permissions = permissionsToCheckFor union e.missingPermissions
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -135,4 +135,6 @@ buttons at the same time to cancel pairing)\n
|
|||
<string name="combov2_datetime_changed">Date and/or time changed</string>
|
||||
<string name="combov2_dst_started">Daylight savings time (DST) started</string>
|
||||
<string name="combov2_dst_ended">Daylight savings time (DST) ended</string>
|
||||
<string name="combov2_cannot_connect_pump_error_observed">Cannot connect to pump because the pump reported an error. User must handle the error and then either wait 5 minutes or press the Refresh button in the driver tab.</string>
|
||||
<string name="combov2_refresh_pump_status_after_error">Refreshing pump status after the pump reported an error</string>
|
||||
</resources>
|
||||
|
|
|
@ -52,7 +52,7 @@ class AapsV2Watchface : BaseWatchFace() {
|
|||
binding.rigBattery.setTextColor(dividerTxtColor)
|
||||
binding.delta.setTextColor(dividerTxtColor)
|
||||
binding.avgDelta.setTextColor(dividerTxtColor)
|
||||
binding.basalRate?.setTextColor(dividerTxtColor)
|
||||
binding.basalRate.setTextColor(dividerTxtColor)
|
||||
binding.bgi.setTextColor(dividerTxtColor)
|
||||
when (loopLevel) {
|
||||
-1 -> binding.loop.setBackgroundResource(R.drawable.loop_grey_25)
|
||||
|
@ -85,7 +85,7 @@ class AapsV2Watchface : BaseWatchFace() {
|
|||
binding.avgDelta.setTextColor(dividerTxtColor)
|
||||
binding.rigBattery.setTextColor(dividerTxtColor)
|
||||
binding.uploaderBattery.setTextColor(dividerTxtColor)
|
||||
binding.basalRate?.setTextColor(dividerTxtColor)
|
||||
binding.basalRate.setTextColor(dividerTxtColor)
|
||||
binding.bgi.setTextColor(dividerTxtColor)
|
||||
binding.iob1.setTextColor(ContextCompat.getColor(this, R.color.dark_midColor))
|
||||
binding.iob2.setTextColor(ContextCompat.getColor(this, R.color.dark_midColor))
|
||||
|
@ -138,7 +138,7 @@ class AapsV2Watchface : BaseWatchFace() {
|
|||
binding.rigBattery.setTextColor(dividerTxtColor)
|
||||
binding.delta.setTextColor(dividerTxtColor)
|
||||
binding.avgDelta.setTextColor(dividerTxtColor)
|
||||
binding.basalRate?.setTextColor(dividerTxtColor)
|
||||
binding.basalRate.setTextColor(dividerTxtColor)
|
||||
binding.bgi.setTextColor(dividerTxtColor)
|
||||
when (loopLevel) {
|
||||
-1 -> binding.loop.setBackgroundResource(R.drawable.loop_grey_25)
|
||||
|
|
|
@ -19,6 +19,7 @@ class AapsWatchface : BaseWatchFace() {
|
|||
}
|
||||
|
||||
override fun setColorDark() {
|
||||
binding.mainLayout.setBackgroundColor(ContextCompat.getColor(this, R.color.dark_background))
|
||||
binding.secondaryLayout.setBackgroundColor(ContextCompat.getColor(this, if (dividerMatchesBg) R.color.dark_background else R.color.dark_statusView))
|
||||
binding.time.setTextColor(ContextCompat.getColor(this, R.color.dark_mTime))
|
||||
val color = when (singleBg.sgvLevel) {
|
||||
|
|
|
@ -9,7 +9,6 @@ import androidx.viewbinding.ViewBinding
|
|||
import com.ustwo.clockwise.common.WatchMode
|
||||
import info.nightscout.androidaps.R
|
||||
import info.nightscout.androidaps.databinding.ActivityBigchartBinding
|
||||
import info.nightscout.androidaps.databinding.ActivityBigchartSmallBinding
|
||||
import info.nightscout.androidaps.watchfaces.utils.BaseWatchFace
|
||||
import info.nightscout.androidaps.watchfaces.utils.WatchfaceViewAdapter
|
||||
|
||||
|
@ -18,11 +17,6 @@ class BigChartWatchface : BaseWatchFace() {
|
|||
private lateinit var binding: WatchfaceViewAdapter
|
||||
|
||||
override fun inflateLayout(inflater: LayoutInflater): ViewBinding {
|
||||
if (resources.displayMetrics.widthPixels < SCREEN_SIZE_SMALL || resources.displayMetrics.heightPixels < SCREEN_SIZE_SMALL) {
|
||||
val layoutBinding = ActivityBigchartSmallBinding.inflate(inflater)
|
||||
binding = WatchfaceViewAdapter.getBinding(layoutBinding)
|
||||
return layoutBinding
|
||||
}
|
||||
val layoutBinding = ActivityBigchartBinding.inflate(inflater)
|
||||
binding = WatchfaceViewAdapter.getBinding(layoutBinding)
|
||||
return layoutBinding
|
||||
|
@ -42,6 +36,7 @@ class BigChartWatchface : BaseWatchFace() {
|
|||
binding.delta?.setTextColor(ContextCompat.getColor(this, R.color.dark_midColor))
|
||||
binding.avgDelta?.setTextColor(ContextCompat.getColor(this, R.color.dark_midColor))
|
||||
binding.timestamp.setTextColor(ContextCompat.getColor(this, R.color.dark_Timestamp))
|
||||
binding.timePeriod?.setTextColor(ContextCompat.getColor(this, R.color.dark_Timestamp))
|
||||
|
||||
highColor = ContextCompat.getColor(this, R.color.dark_midColor)
|
||||
lowColor = ContextCompat.getColor(this, R.color.dark_midColor)
|
||||
|
@ -69,6 +64,7 @@ class BigChartWatchface : BaseWatchFace() {
|
|||
|
||||
val colorTime = if (ageLevel == 1) R.color.dark_Timestamp else R.color.dark_TimestampOld
|
||||
binding.timestamp.setTextColor(ContextCompat.getColor(this, colorTime))
|
||||
binding.timePeriod?.setTextColor(ContextCompat.getColor(this, colorTime))
|
||||
|
||||
highColor = ContextCompat.getColor(this, R.color.dark_highColor)
|
||||
lowColor = ContextCompat.getColor(this, R.color.dark_lowColor)
|
||||
|
@ -97,6 +93,7 @@ class BigChartWatchface : BaseWatchFace() {
|
|||
|
||||
val colorTime = if (ageLevel == 1) R.color.light_mTimestamp1 else R.color.light_mTimestamp
|
||||
binding.timestamp.setTextColor(ContextCompat.getColor(this, colorTime))
|
||||
binding.timePeriod?.setTextColor(ContextCompat.getColor(this, colorTime))
|
||||
|
||||
highColor = ContextCompat.getColor(this, R.color.light_highColor)
|
||||
lowColor = ContextCompat.getColor(this, R.color.light_lowColor)
|
||||
|
|
|
@ -67,18 +67,17 @@ class DigitalStyleWatchface : BaseWatchFace() {
|
|||
/* frame styles*/
|
||||
val mShapesElements = layoutView?.findViewById<LinearLayout>(R.id.shapes_elements)
|
||||
if (mShapesElements != null) {
|
||||
val displayFormatType = if (mShapesElements.contentDescription.toString().startsWith("round")) "round" else "rect"
|
||||
val displayStyle = sp.getString(R.string.key_digital_style_frame_style, "full")
|
||||
val displayFrameColor = sp.getString(R.string.key_digital_style_frame_color, "red")
|
||||
val displayFrameColorSaturation = sp.getString(R.string.key_digital_style_frame_color_saturation, "500")
|
||||
val displayFrameColorOpacity = sp.getString(R.string.key_digital_style_frame_color_opacity, "1")
|
||||
|
||||
// Load image with shapes
|
||||
val styleDrawableName = "digitalstyle_bg_" + displayStyle + "_" + displayFormatType
|
||||
val styleDrawableName = "digital_style_bg_" + displayStyle
|
||||
try {
|
||||
mShapesElements.background = ContextCompat.getDrawable(this, resources.getIdentifier(styleDrawableName, "drawable", this.packageName))
|
||||
} catch (e: Exception) {
|
||||
aapsLogger.error("digitalstyle_frameStyle", "RESOURCE NOT FOUND >> $styleDrawableName")
|
||||
aapsLogger.error("digital_style_frameStyle", "RESOURCE NOT FOUND >> $styleDrawableName")
|
||||
}
|
||||
|
||||
// set background-tint-color
|
||||
|
@ -86,13 +85,13 @@ class DigitalStyleWatchface : BaseWatchFace() {
|
|||
mShapesElements.backgroundTintList = null
|
||||
} else {
|
||||
val strColorName = if (displayFrameColor == "white" || displayFrameColor == "black") displayFrameColor else displayFrameColor + "_" + displayFrameColorSaturation
|
||||
aapsLogger.debug(LTag.WEAR, "digitalstyle_strColorName", strColorName)
|
||||
aapsLogger.debug(LTag.WEAR, "digital_style_strColorName", strColorName)
|
||||
try {
|
||||
val colorStateList = ContextCompat.getColorStateList(this, resources.getIdentifier(strColorName, "color", this.packageName))
|
||||
mShapesElements.backgroundTintList = colorStateList
|
||||
} catch (e: Exception) {
|
||||
mShapesElements.backgroundTintList = null
|
||||
aapsLogger.error("digitalstyle_colorName", "COLOR NOT FOUND >> $strColorName")
|
||||
aapsLogger.error("digital_style_colorName", "COLOR NOT FOUND >> $strColorName")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -6,9 +6,7 @@ import androidx.viewbinding.ViewBinding
|
|||
import com.ustwo.clockwise.common.WatchMode
|
||||
import info.nightscout.androidaps.R
|
||||
import info.nightscout.androidaps.databinding.ActivityBigchartBinding
|
||||
import info.nightscout.androidaps.databinding.ActivityBigchartSmallBinding
|
||||
import info.nightscout.androidaps.databinding.ActivityNochartBinding
|
||||
import info.nightscout.androidaps.databinding.ActivityNochartSmallBinding
|
||||
import info.nightscout.androidaps.watchfaces.utils.BaseWatchFace
|
||||
import info.nightscout.androidaps.watchfaces.utils.WatchfaceViewAdapter
|
||||
|
||||
|
@ -17,11 +15,6 @@ class NoChartWatchface : BaseWatchFace() {
|
|||
private lateinit var binding: WatchfaceViewAdapter
|
||||
|
||||
override fun inflateLayout(inflater: LayoutInflater): ViewBinding {
|
||||
if (resources.displayMetrics.widthPixels < SCREEN_SIZE_SMALL || resources.displayMetrics.heightPixels < SCREEN_SIZE_SMALL) {
|
||||
val layoutBinding = ActivityNochartSmallBinding.inflate(inflater)
|
||||
binding = WatchfaceViewAdapter.getBinding(layoutBinding)
|
||||
return layoutBinding
|
||||
}
|
||||
val layoutBinding = ActivityNochartBinding.inflate(inflater)
|
||||
binding = WatchfaceViewAdapter.getBinding(layoutBinding)
|
||||
return layoutBinding
|
||||
|
@ -35,6 +28,7 @@ class NoChartWatchface : BaseWatchFace() {
|
|||
binding.delta?.setTextColor(ContextCompat.getColor(this, R.color.dark_midColor))
|
||||
binding.avgDelta?.setTextColor(ContextCompat.getColor(this, R.color.dark_midColor))
|
||||
binding.timestamp.setTextColor(ContextCompat.getColor(this, R.color.dark_Timestamp))
|
||||
binding.timePeriod?.setTextColor(ContextCompat.getColor(this, R.color.dark_Timestamp))
|
||||
}
|
||||
|
||||
override fun setColorDark() {
|
||||
|
@ -52,6 +46,7 @@ class NoChartWatchface : BaseWatchFace() {
|
|||
binding.avgDelta?.setTextColor(ContextCompat.getColor(this, color))
|
||||
val colorTime = if (ageLevel == 1) R.color.dark_Timestamp else R.color.dark_TimestampOld
|
||||
binding.timestamp.setTextColor(ContextCompat.getColor(this, colorTime))
|
||||
binding.timePeriod?.setTextColor(ContextCompat.getColor(this, colorTime))
|
||||
}
|
||||
|
||||
override fun setColorBright() {
|
||||
|
@ -70,6 +65,7 @@ class NoChartWatchface : BaseWatchFace() {
|
|||
binding.avgDelta?.setTextColor(ContextCompat.getColor(this, color))
|
||||
val colorTime = if (ageLevel == 1) R.color.light_mTimestamp1 else R.color.light_mTimestamp
|
||||
binding.timestamp.setTextColor(ContextCompat.getColor(this, colorTime))
|
||||
binding.timePeriod?.setTextColor(ContextCompat.getColor(this, colorTime))
|
||||
|
||||
} else {
|
||||
setColorDark()
|
||||
|
|
|
@ -331,7 +331,7 @@ abstract class BaseWatchFace : WatchFace() {
|
|||
}
|
||||
|
||||
private fun setDateAndTime() {
|
||||
binding.time?.text = dateUtil.timeString()
|
||||
binding.time?.text = if(binding.timePeriod == null) dateUtil.timeString() else dateUtil.hourString() + ":" + dateUtil.minuteString()
|
||||
binding.hour?.text = dateUtil.hourString()
|
||||
binding.minute?.text = dateUtil.minuteString()
|
||||
binding.dateTime?.visibility = sp.getBoolean(R.string.key_show_date, false).toVisibility()
|
||||
|
|
|
@ -5,7 +5,6 @@ import info.nightscout.androidaps.databinding.ActivityHomeLargeBinding
|
|||
import info.nightscout.androidaps.databinding.ActivityHome2Binding
|
||||
import info.nightscout.androidaps.databinding.ActivityHomeBinding
|
||||
import info.nightscout.androidaps.databinding.ActivityBigchartBinding
|
||||
import info.nightscout.androidaps.databinding.ActivityBigchartSmallBinding
|
||||
import info.nightscout.androidaps.databinding.ActivityCockpitBinding
|
||||
import info.nightscout.androidaps.databinding.ActivityDigitalstyleBinding
|
||||
import info.nightscout.androidaps.databinding.ActivityNochartBinding
|
||||
|
@ -20,7 +19,6 @@ class WatchfaceViewAdapter(
|
|||
a2: ActivityHome2Binding? = null,
|
||||
aa: ActivityHomeBinding? = null,
|
||||
bC: ActivityBigchartBinding? = null,
|
||||
bCs: ActivityBigchartSmallBinding? = null,
|
||||
cp: ActivityCockpitBinding? = null,
|
||||
ds: ActivityDigitalstyleBinding? = null,
|
||||
nC: ActivityNochartBinding? = null,
|
||||
|
@ -28,7 +26,7 @@ class WatchfaceViewAdapter(
|
|||
) {
|
||||
|
||||
init {
|
||||
if (aL == null && a2 == null && aa == null && bC == null && bCs == null && cp == null && ds == null && nC == null && sP == null) {
|
||||
if (aL == null && a2 == null && aa == null && bC == null && cp == null && ds == null && nC == null && sP == null) {
|
||||
throw IllegalArgumentException("Require at least on Binding parameter")
|
||||
}
|
||||
}
|
||||
|
@ -67,7 +65,7 @@ class WatchfaceViewAdapter(
|
|||
val iob2 = a2?.iob2 ?: cp?.iob2 ?: ds?.iob2 ?: sP?.iob2
|
||||
val chart = a2?.chart ?: aa?.chart ?: bC?.chart ?: bC?.chart ?: ds?.chart ?: sP?.chart
|
||||
val status = aL?.status ?: aa?.status ?: bC?.status ?: bC?.status ?: nC?.status
|
||||
val timePeriod = ds?.timePeriod
|
||||
val timePeriod = ds?.timePeriod ?: aL?.timePeriod ?: nC?.timePeriod ?: bC?.timePeriod
|
||||
val dayName = ds?.dayName
|
||||
val mainMenuTap = ds?.mainMenuTap ?: sP?.mainMenuTap
|
||||
val chartZoomTap = ds?.chartZoomTap ?: sP?.chartZoomTap
|
||||
|
@ -89,11 +87,10 @@ class WatchfaceViewAdapter(
|
|||
is ActivityHome2Binding -> WatchfaceViewAdapter(null, bindLayout)
|
||||
is ActivityHomeBinding -> WatchfaceViewAdapter(null, null, bindLayout)
|
||||
is ActivityBigchartBinding -> WatchfaceViewAdapter(null, null, null, bindLayout)
|
||||
is ActivityBigchartSmallBinding -> WatchfaceViewAdapter(null, null, null, null, bindLayout)
|
||||
is ActivityCockpitBinding -> WatchfaceViewAdapter(null, null, null, null, null, bindLayout)
|
||||
is ActivityDigitalstyleBinding -> WatchfaceViewAdapter(null, null, null, null, null, null, bindLayout)
|
||||
is ActivityNochartBinding -> WatchfaceViewAdapter(null, null, null, null, null, null, null, bindLayout)
|
||||
is ActivitySteampunkBinding -> WatchfaceViewAdapter(null, null, null, null, null, null, null, null, bindLayout)
|
||||
is ActivityCockpitBinding -> WatchfaceViewAdapter(null, null, null, null, bindLayout)
|
||||
is ActivityDigitalstyleBinding -> WatchfaceViewAdapter(null, null, null, null, null, bindLayout)
|
||||
is ActivityNochartBinding -> WatchfaceViewAdapter(null, null, null, null, null, null, bindLayout)
|
||||
is ActivitySteampunkBinding -> WatchfaceViewAdapter(null, null, null, null, null, null, null, bindLayout)
|
||||
else -> throw IllegalArgumentException("ViewBinding is not implement in WatchfaceViewAdapter")
|
||||
}
|
||||
}
|
||||
|
|
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 65 KiB |
Before Width: | Height: | Size: 354 B After Width: | Height: | Size: 354 B |
Before Width: | Height: | Size: 137 B After Width: | Height: | Size: 137 B |
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 354 B After Width: | Height: | Size: 354 B |
Before Width: | Height: | Size: 137 B After Width: | Height: | Size: 137 B |
Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 69 KiB |
|
@ -1,111 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/main_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@color/black"
|
||||
android:gravity="center_horizontal"
|
||||
android:orientation="vertical"
|
||||
android:textAlignment="center"
|
||||
tools:context=".watchfaces.AapsWatchface"
|
||||
tools:deviceIds="wear_square"
|
||||
tools:ignore="MissingDefaultResource">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginTop="-5dp"
|
||||
android:gravity="center_horizontal"
|
||||
android:orientation="horizontal"
|
||||
android:paddingTop="5dp"
|
||||
android:textAlignment="center">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/delta"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom"
|
||||
android:layout_marginEnd="5dp"
|
||||
android:gravity="center_horizontal|bottom"
|
||||
android:text="---"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="30sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/sgv"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:gravity="center_horizontal"
|
||||
android:text="---"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="41sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/avg_delta"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom"
|
||||
android:layout_marginStart="5dp"
|
||||
android:gravity="center_horizontal|bottom"
|
||||
android:text="---"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="30sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<lecho.lib.hellocharts.view.LineChartView
|
||||
android:id="@+id/chart"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_gravity="bottom"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center_horizontal" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/status"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="18sp"
|
||||
tools:text="E xU/h IOB: x (x+x)" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_horizontal"
|
||||
android:orientation="horizontal"
|
||||
android:textAlignment="center">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/time"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginEnd="6dp"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="35sp"
|
||||
tools:text="12:00" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/timestamp"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="26sp"
|
||||
tools:text="-- '" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
|
@ -1,114 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/main_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@color/black"
|
||||
android:gravity="center_horizontal"
|
||||
android:orientation="vertical"
|
||||
android:textAlignment="center"
|
||||
tools:context=".watchfaces.AapsWatchface"
|
||||
tools:deviceIds="wear_square"
|
||||
tools:ignore="MissingDefaultResource">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginTop="-5dp"
|
||||
android:gravity="center_horizontal"
|
||||
android:orientation="horizontal"
|
||||
android:paddingTop="5dp"
|
||||
android:textAlignment="center">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/delta"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical|center_horizontal|center"
|
||||
android:layout_marginEnd="5dp"
|
||||
android:gravity="center_horizontal|bottom"
|
||||
android:text="---"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="24sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/sgv"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:gravity="center_horizontal"
|
||||
android:text="---"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="34sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/avg_delta"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical|center_horizontal|center"
|
||||
android:layout_marginStart="5dp"
|
||||
android:gravity="center_horizontal|bottom"
|
||||
android:text="---"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="24sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/status"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginTop="-5sp"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="18sp"
|
||||
tools:text="E xU/h IOB: x (x+x)" />
|
||||
|
||||
<lecho.lib.hellocharts.view.LineChartView
|
||||
android:id="@+id/chart"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_gravity="bottom"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center_horizontal" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="-5sp"
|
||||
android:gravity="center_horizontal"
|
||||
android:orientation="horizontal"
|
||||
android:textAlignment="center">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/time"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginEnd="6dp"
|
||||
android:paddingTop="-5sp"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="34sp"
|
||||
tools:text="12:00" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/timestamp"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical|center_horizontal|center"
|
||||
android:text="--'"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="24sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
|
@ -1,447 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/main_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@drawable/airplane_cockpit_outside_clouds"
|
||||
tools:context=".watchfaces.CockpitWatchface"
|
||||
tools:deviceIds="wear_square"
|
||||
tools:ignore="MissingDefaultResource">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/inside"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
android:background="@drawable/airplane_cockpit"
|
||||
android:orientation="vertical"
|
||||
android:weightSum="1">
|
||||
|
||||
<View
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_weight="0.095" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/windows"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_weight="0.2575"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<View
|
||||
android:layout_width="0px"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="0.47"
|
||||
tools:ignore="NestedWeights" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/warnings"
|
||||
android:layout_width="0px"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="0.06"
|
||||
android:baselineAligned="false"
|
||||
android:orientation="vertical">
|
||||
|
||||
<View
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_weight="0.2" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/highLight"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_gravity="center"
|
||||
android:layout_weight="1"
|
||||
android:background="@drawable/airplane_led_grey_unlit"
|
||||
android:gravity="center"
|
||||
android:text="@string/first_char_high"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/primary_text_dark"
|
||||
android:textSize="8sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="SmallSp" />
|
||||
|
||||
<View
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_weight="2" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/lowLight"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_gravity="center"
|
||||
android:layout_weight="1"
|
||||
android:background="@drawable/airplane_led_grey_unlit"
|
||||
android:gravity="center"
|
||||
android:text="@string/first_char_low"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/primary_text_dark"
|
||||
android:textSize="8sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="SmallSp" />
|
||||
|
||||
<View
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_weight="0.2" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<View
|
||||
android:layout_width="0px"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="0.47" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/dashboard"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_weight="0.0775"
|
||||
android:orientation="vertical">
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/instruments"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_weight="0.57"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<View
|
||||
android:layout_width="0px"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="0.08"
|
||||
tools:ignore="NestedWeights" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/panel1"
|
||||
android:layout_width="0px"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="0.275"
|
||||
android:orientation="vertical">
|
||||
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_weight="0.07" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_weight="0.5"
|
||||
android:orientation="vertical"
|
||||
android:weightSum="1">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/sgv"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:text="---"
|
||||
android:textColor="@color/primary_text_dark"
|
||||
android:textSize="30sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_weight="0.03" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_weight="0.276"
|
||||
android:orientation="horizontal"
|
||||
android:weightSum="1">
|
||||
|
||||
<TextView
|
||||
android:layout_width="0px"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="0.35"
|
||||
tools:ignore="NestedWeights" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/timestamp"
|
||||
android:layout_width="0px"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:layout_weight="0.65"
|
||||
android:gravity="center"
|
||||
android:text="--'"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/primary_text_dark"
|
||||
android:textSize="14sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_weight="0.07" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<View
|
||||
android:layout_width="0px"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="0.0225" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/panel2"
|
||||
android:layout_width="0px"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="0.245"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_weight="0.020" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/time"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="0px"
|
||||
android:layout_gravity="center"
|
||||
android:layout_weight="0.19"
|
||||
android:gravity="center"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/primary_text_dark"
|
||||
android:textSize="16sp"
|
||||
android:textStyle="bold"
|
||||
tools:text="12:00" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/basalRate"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="0px"
|
||||
android:layout_gravity="bottom|center_horizontal"
|
||||
android:layout_weight="0.19"
|
||||
android:gravity="bottom|center_horizontal"
|
||||
android:text="@string/no_tmp_basal_u_h"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/primary_text_dark"
|
||||
android:textSize="12sp"
|
||||
android:textStyle="bold" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/iob2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="0px"
|
||||
android:layout_gravity="bottom|center_horizontal"
|
||||
android:layout_weight="0.18"
|
||||
android:gravity="bottom|center_horizontal"
|
||||
android:text="@string/no_iob_u"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/primary_text_dark"
|
||||
android:textSize="12sp"
|
||||
android:textStyle="bold" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/cob2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="0px"
|
||||
android:layout_gravity="bottom|center_horizontal"
|
||||
android:layout_weight="0.185"
|
||||
android:gravity="bottom|center_horizontal"
|
||||
android:text="@string/no_cob_g"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="12sp"
|
||||
android:textStyle="bold" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="0px"
|
||||
android:layout_gravity="center"
|
||||
android:layout_weight="0.185"
|
||||
android:gravity="center"
|
||||
android:orientation="horizontal"
|
||||
android:textAlignment="center">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/uploader_battery"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="bottom|center_horizontal"
|
||||
android:gravity="bottom|center_horizontal"
|
||||
android:text="--%"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/primary_text_dark"
|
||||
android:textSize="12sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/rig_battery"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="bottom|center_horizontal"
|
||||
android:gravity="bottom|center_horizontal"
|
||||
android:paddingStart="4dp"
|
||||
android:paddingEnd="0dp"
|
||||
android:text="--%"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/primary_text_dark"
|
||||
android:textSize="12sp"
|
||||
android:textStyle="bold"
|
||||
android:visibility="gone"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_weight="0.06" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<View
|
||||
android:layout_width="0px"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="0.0225" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/panel3"
|
||||
android:layout_width="0px"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="0.275"
|
||||
android:orientation="vertical">
|
||||
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_weight="0.07" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_gravity="center"
|
||||
android:layout_weight="0.5"
|
||||
android:gravity="center"
|
||||
android:orientation="vertical"
|
||||
android:weightSum="0.5">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/direction"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_gravity="center"
|
||||
android:layout_weight="0.333"
|
||||
android:gravity="center"
|
||||
android:text="--"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/primary_text_dark"
|
||||
android:textSize="28sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="HardcodedText, NestedWeights" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_gravity="center"
|
||||
android:layout_weight="0.167"
|
||||
android:gravity="center"
|
||||
android:weightSum="2">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/delta"
|
||||
android:layout_width="0px"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center"
|
||||
android:text="+/-"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/primary_text_dark"
|
||||
android:textSize="13sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/avg_delta"
|
||||
android:layout_width="0px"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center"
|
||||
android:text="@string/abbreviation_average"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/primary_text_dark"
|
||||
android:textSize="13sp"
|
||||
android:textStyle="bold" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_weight="0.06" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_weight="0.250"
|
||||
android:orientation="horizontal"
|
||||
android:weightSum="1">
|
||||
|
||||
<View
|
||||
android:layout_width="0px"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="0.1"
|
||||
tools:ignore="NestedWeights" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/loop"
|
||||
android:layout_width="0px"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="start"
|
||||
android:layout_weight="0.5"
|
||||
android:background="@drawable/loop_grey_25"
|
||||
android:gravity="center"
|
||||
android:text="--'"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/primary_text_dark"
|
||||
android:textSize="14sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<View
|
||||
android:id="@+id/AAPSv2"
|
||||
android:layout_width="0px"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="0.4"
|
||||
android:visibility="invisible" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_weight="0.16" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<View
|
||||
android:layout_width="0px"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="0.08" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</RelativeLayout>
|
|
@ -1,610 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/main_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@color/black"
|
||||
tools:deviceIds="wear_square"
|
||||
tools:ignore="MissingDefaultResource">
|
||||
|
||||
<!-- background-image with shapes elements-->
|
||||
<LinearLayout
|
||||
android:id="@+id/shapes_elements"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@drawable/digitalstyle_bg_full_rect"
|
||||
android:contentDescription="rect-shape-elements"
|
||||
android:orientation="horizontal"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<!-- root-element-->
|
||||
<LinearLayout
|
||||
android:id="@+id/watchface_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:baselineAligned="false"
|
||||
android:orientation="horizontal"
|
||||
android:weightSum="8">
|
||||
|
||||
<!-- left side 3/8 width -->
|
||||
<LinearLayout
|
||||
android:id="@+id/main_menu_tap"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="3"
|
||||
android:orientation="vertical"
|
||||
android:weightSum="100">
|
||||
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="13.95"
|
||||
tools:ignore="NestedWeights" />
|
||||
|
||||
<!-- COB -->
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="20.44"
|
||||
android:orientation="horizontal"
|
||||
android:weightSum="13">
|
||||
|
||||
<View
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="4.9" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="7.0"
|
||||
android:gravity="center_horizontal|center_vertical"
|
||||
android:orientation="vertical"
|
||||
android:weightSum="5">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/cob1"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="2"
|
||||
android:fontFamily="@font/roboto_slab_light"
|
||||
android:gravity="bottom|center_horizontal"
|
||||
android:text="@string/activity_carb"
|
||||
android:textColor="@color/light_grey"
|
||||
android:textSize="10sp"
|
||||
tools:ignore="SmallSp, NestedWeights" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/cob2"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="3"
|
||||
android:fontFamily="@font/roboto_slab_light"
|
||||
android:gravity="top|center_horizontal"
|
||||
android:letterSpacing="-0.075"
|
||||
android:lines="1"
|
||||
android:text="@string/cob_000g"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="14sp" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<View
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1.1" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="2.87" />
|
||||
|
||||
<!-- SGV / BZ-->
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="25.48"
|
||||
android:orientation="horizontal"
|
||||
android:weightSum="13">
|
||||
|
||||
<View
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="3.2" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="8.7"
|
||||
android:gravity="center_horizontal|center_vertical"
|
||||
android:orientation="vertical"
|
||||
android:weightSum="20">
|
||||
|
||||
<!-- 1st line with direction and timestamp-->
|
||||
<LinearLayout
|
||||
android:id="@+id/directionLayout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_weight="9"
|
||||
android:baselineAligned="false"
|
||||
android:gravity="center_vertical|center_horizontal"
|
||||
android:orientation="horizontal"
|
||||
android:weightSum="10"
|
||||
tools:ignore="NestedWeights">
|
||||
|
||||
<View
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="2" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/direction"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_weight="3"
|
||||
android:fontFamily="sans-serif-condensed-medium"
|
||||
android:gravity="center_horizontal|bottom"
|
||||
android:text="--"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="16sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/timestamp"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_marginStart="3dp"
|
||||
android:layout_marginBottom="2dp"
|
||||
android:layout_weight="3"
|
||||
android:fontFamily="sans-serif-condensed-light"
|
||||
android:text="--'"
|
||||
android:textColor="@color/light_grey"
|
||||
android:textSize="10sp"
|
||||
tools:ignore="HardcodedText,SmallSp" />
|
||||
|
||||
<View
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="2" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<!-- 2nd line with sgv-->
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginTop="-10dp"
|
||||
android:layout_weight="11"
|
||||
android:baselineAligned="false"
|
||||
android:gravity="center_vertical|center_horizontal"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/sgv"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:fontFamily="@font/roboto_slab_light"
|
||||
android:gravity="top|center_horizontal"
|
||||
android:letterSpacing="-0.05"
|
||||
android:lines="1"
|
||||
android:text="@string/svg_00_0"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="20sp"
|
||||
android:textStyle="bold" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<View
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1.1" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="2.87" />
|
||||
|
||||
<!-- IOB -->
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="20.44"
|
||||
android:orientation="horizontal"
|
||||
android:weightSum="13">
|
||||
|
||||
<View
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="4.9" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="7.0"
|
||||
android:gravity="center_horizontal|center_vertical"
|
||||
android:orientation="vertical"
|
||||
android:weightSum="5">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/iob1"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="2"
|
||||
android:fontFamily="@font/roboto_slab_light"
|
||||
android:gravity="bottom|center_horizontal"
|
||||
android:text="@string/activity_IOB"
|
||||
android:textColor="@color/light_grey"
|
||||
android:textSize="10sp"
|
||||
tools:ignore="SmallSp, NestedWeights" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/iob2"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="3"
|
||||
android:fontFamily="@font/roboto_slab_light"
|
||||
android:gravity="top|center_horizontal"
|
||||
android:letterSpacing="-0.075"
|
||||
android:lines="1"
|
||||
android:text="@string/iob_0_00u"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="14sp" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<View
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1.1" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="13.95" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<!-- right side 5/8 width -->
|
||||
<LinearLayout
|
||||
android:id="@+id/chart_zoom_tap"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="5"
|
||||
android:baselineAligned="false"
|
||||
android:orientation="vertical"
|
||||
android:weightSum="2">
|
||||
|
||||
<!-- right side 1/2 height - top half -->
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginStart="9dp"
|
||||
android:layout_marginEnd="0dp"
|
||||
android:layout_weight="1"
|
||||
android:orientation="vertical"
|
||||
tools:ignore="NestedWeights">
|
||||
|
||||
<!-- right side top - spacer 2/10 -->
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="2" />
|
||||
|
||||
<!-- right side top - date 4/10 -->
|
||||
<LinearLayout
|
||||
android:id="@+id/date_time"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="4"
|
||||
android:orientation="vertical"
|
||||
android:weightSum="2">
|
||||
|
||||
<!-- day name (short)-->
|
||||
<LinearLayout
|
||||
android:id="@+id/date_time1"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="1"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/day_name"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="5"
|
||||
android:fontFamily="@font/roboto_condensed_regular"
|
||||
android:textAllCaps="true"
|
||||
android:textColor="@color/white"
|
||||
android:textFontWeight="400"
|
||||
android:textSize="18sp"
|
||||
tools:text="DDD" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/week_number"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="4"
|
||||
android:fontFamily="@font/roboto_condensed_light"
|
||||
android:letterSpacing="-0.1"
|
||||
android:textAllCaps="true"
|
||||
android:textColor="@color/light_grey"
|
||||
android:textFontWeight="400"
|
||||
android:textSize="18sp"
|
||||
android:visibility="gone"
|
||||
tools:text="ww" />
|
||||
|
||||
<View
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="3" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<!-- day number + month (short)-->
|
||||
<LinearLayout
|
||||
android:id="@+id/date_time2"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="1"
|
||||
android:orientation="horizontal">
|
||||
<!-- day number-->
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/day"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:fontFamily="@font/roboto_condensed_regular"
|
||||
android:paddingStart="0dp"
|
||||
android:paddingEnd="4dp"
|
||||
android:textColor="@color/light_grey"
|
||||
android:textSize="18sp"
|
||||
tools:text="DD" />
|
||||
|
||||
</LinearLayout>
|
||||
<!-- month short-->
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/month"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="5dp"
|
||||
android:fontFamily="@font/roboto_condensed_regular"
|
||||
android:textAllCaps="true"
|
||||
android:textColor="@color/light_grey"
|
||||
android:textSize="18sp"
|
||||
tools:text="MMM" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<!-- right side top - hour minute 4/10 -->
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="4"
|
||||
android:baselineAligned="false"
|
||||
android:gravity="start|center_vertical"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginTop="-5dp">
|
||||
|
||||
<!-- hour -->
|
||||
<TextView
|
||||
android:id="@+id/hour"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="start"
|
||||
android:fontFamily="@font/roboto_condensed_bold"
|
||||
android:textAllCaps="true"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="40sp"
|
||||
android:textStyle="bold"
|
||||
tools:text="HH" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1"
|
||||
android:orientation="vertical">
|
||||
|
||||
<!-- minute -->
|
||||
<TextView
|
||||
android:id="@+id/minute"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="start"
|
||||
android:layout_marginStart="6sp"
|
||||
android:layout_marginBottom="-8sp"
|
||||
android:fontFamily="@font/roboto_condensed_bold"
|
||||
android:textColor="@color/light_grey"
|
||||
android:textSize="26sp"
|
||||
android:textStyle="bold"
|
||||
tools:text="MI" />
|
||||
|
||||
<!-- 12h period AM / PM -->
|
||||
<TextView
|
||||
android:id="@+id/timePeriod"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom"
|
||||
android:layout_marginStart="8sp"
|
||||
android:fontFamily="@font/roboto_condensed_bold"
|
||||
android:textColor="@color/light_grey"
|
||||
android:textSize="10sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="SmallSp"
|
||||
tools:text="AM" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<!-- right side 1/2 height - bottom half -->
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginLeft="7dp"
|
||||
android:layout_marginRight="7dp"
|
||||
android:layout_weight="1"
|
||||
android:baselineAligned="false"
|
||||
android:gravity="start|top"
|
||||
android:orientation="vertical"
|
||||
android:weightSum="10">
|
||||
|
||||
<!-- right side bottom - status bar 2/10 -->
|
||||
<LinearLayout
|
||||
android:id="@+id/secondary_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="2"
|
||||
android:baselineAligned="false"
|
||||
android:gravity="center_horizontal|center_vertical"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/delta"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center_horizontal|center_vertical"
|
||||
android:text="+/-"
|
||||
android:textColor="@color/light_grey"
|
||||
android:textSize="10sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="HardcodedText, SmallSp, NestedWeights" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/avg_delta"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center_horizontal|center_vertical"
|
||||
android:text="@string/abbreviation_average"
|
||||
android:textColor="@color/light_grey"
|
||||
android:textSize="10sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="SmallSp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/uploader_battery"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center_horizontal|center_vertical"
|
||||
android:text="--%"
|
||||
android:textColor="@color/light_grey"
|
||||
android:textSize="10sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="HardcodedText,SmallSp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/rig_battery"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center_horizontal|center_vertical"
|
||||
android:text="--%"
|
||||
android:textColor="@color/light_grey"
|
||||
android:textSize="10sp"
|
||||
android:textStyle="bold"
|
||||
android:visibility="gone"
|
||||
tools:ignore="HardcodedText,SmallSp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/basalRate"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1.7"
|
||||
android:gravity="center_horizontal|center_vertical"
|
||||
android:text="@string/no_tmp_basal_u_h"
|
||||
android:textColor="@color/light_grey"
|
||||
android:textSize="10sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="SmallSp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/bgi"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center_horizontal|center_vertical"
|
||||
android:textColor="@color/light_grey"
|
||||
android:textSize="10sp"
|
||||
android:textStyle="bold"
|
||||
android:visibility="gone"
|
||||
tools:ignore="SmallSp"
|
||||
tools:text="bgi" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<!-- right side bottom - diagram 6/10 -->
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="6"
|
||||
android:baselineAligned="false"
|
||||
android:orientation="vertical"
|
||||
android:weightSum="1">
|
||||
|
||||
<lecho.lib.hellocharts.view.LineChartView
|
||||
android:id="@+id/chart"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_gravity="bottom"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center_horizontal|top"
|
||||
tools:ignore="NestedWeights" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<!-- right side bottom - spacer 2/10 -->
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="2" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<!-- FLAGs -->
|
||||
<View
|
||||
android:id="@+id/AAPSv2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:visibility="gone" />
|
||||
|
||||
</RelativeLayout>
|
|
@ -1,158 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/main_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@color/black"
|
||||
android:gravity="center_horizontal"
|
||||
android:orientation="vertical"
|
||||
android:textAlignment="center"
|
||||
android:weightSum="1"
|
||||
tools:context=".watchfaces.AapsWatchface"
|
||||
tools:deviceIds="wear_square"
|
||||
tools:ignore="MissingDefaultResource">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginTop="-5dp"
|
||||
android:gravity="center_horizontal"
|
||||
android:orientation="horizontal"
|
||||
android:paddingTop="5dp"
|
||||
android:textAlignment="center"
|
||||
android:weightSum="1">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/sgv"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom"
|
||||
android:layout_marginEnd="5dp"
|
||||
android:layout_marginBottom="-2dp"
|
||||
android:gravity="bottom"
|
||||
android:paddingTop="-2dp"
|
||||
android:text="---"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="41sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:baselineAligned="false"
|
||||
android:gravity="center_horizontal"
|
||||
android:orientation="vertical"
|
||||
android:textAlignment="center"
|
||||
android:weightSum="1">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/direction"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal|bottom"
|
||||
android:layout_marginTop="-2dp"
|
||||
android:layout_marginBottom="-5dp"
|
||||
android:gravity="center_horizontal|bottom"
|
||||
android:paddingTop="1dp"
|
||||
android:text="--"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="30sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/delta"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom"
|
||||
android:gravity="center_horizontal|bottom"
|
||||
android:text="@string/delta_na"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="10sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="SmallSp" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/secondary_layout"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:background="@color/light_grey"
|
||||
android:orientation="horizontal"
|
||||
android:padding="1dp"
|
||||
android:textAlignment="center">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/timestamp"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/time_stamp_na_min_ago"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/black"
|
||||
android:textSize="10sp"
|
||||
tools:ignore="SmallSp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/uploader_battery"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="10sp"
|
||||
android:paddingEnd="0sp"
|
||||
android:text="@string/uploader_na"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/black"
|
||||
android:textSize="10sp"
|
||||
tools:ignore="SmallSp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/raw"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="10sp"
|
||||
android:paddingEnd="0sp"
|
||||
android:text=""
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/black"
|
||||
android:textSize="10sp"
|
||||
tools:ignore="SmallSp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/status"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="10sp"
|
||||
android:paddingEnd="0sp"
|
||||
android:text="@string/no_status"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/black"
|
||||
android:textSize="10sp"
|
||||
tools:ignore="SmallSp" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/time"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal|top"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="35sp"
|
||||
tools:text="12:00" />
|
||||
|
||||
<lecho.lib.hellocharts.view.LineChartView
|
||||
android:id="@+id/chart"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="77dp"
|
||||
android:layout_gravity="bottom"
|
||||
android:gravity="center_horizontal|top" />
|
||||
|
||||
</LinearLayout>
|
|
@ -1,351 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/main_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@color/black"
|
||||
android:orientation="vertical"
|
||||
android:textAlignment="center"
|
||||
android:weightSum="1"
|
||||
tools:context=".watchfaces.AapsV2Watchface"
|
||||
tools:deviceIds="wear_square"
|
||||
tools:ignore="MissingDefaultResource">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/primary_layout"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_weight="0.27"
|
||||
android:gravity="center_horizontal"
|
||||
android:orientation="horizontal"
|
||||
android:textAlignment="center">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/loop"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom|center"
|
||||
android:background="@drawable/loop_grey_25"
|
||||
android:gravity="center"
|
||||
android:text="--'"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="14sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/sgv"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal|bottom"
|
||||
android:layout_marginBottom="-2dp"
|
||||
android:gravity="bottom|end"
|
||||
android:paddingStart="5dp"
|
||||
android:paddingTop="-2dp"
|
||||
android:paddingEnd="5dp"
|
||||
android:text="---"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="38sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="fill_parent"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/direction"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal|bottom"
|
||||
android:gravity="center_horizontal|bottom"
|
||||
android:text="--"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="22sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/timestamp"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="2dp"
|
||||
android:gravity="center"
|
||||
android:text="--'"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="14sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/secondary_layout"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_gravity="center"
|
||||
android:layout_weight="0.10"
|
||||
android:background="@color/light_grey"
|
||||
android:gravity="center"
|
||||
android:orientation="vertical"
|
||||
android:padding="1dp">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:orientation="horizontal"
|
||||
android:paddingStart="2dp"
|
||||
android:paddingEnd="2dp"
|
||||
android:textAlignment="center">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/delta"
|
||||
android:layout_width="0px"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center"
|
||||
android:text="+/-"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/black"
|
||||
android:textSize="12sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/avg_delta"
|
||||
android:layout_width="0px"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center"
|
||||
android:text="@string/abbreviation_average"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/black"
|
||||
android:textSize="12sp"
|
||||
android:textStyle="bold" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/uploader_battery"
|
||||
android:layout_width="0px"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center"
|
||||
android:text="--%"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/black"
|
||||
android:textSize="12sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/rig_battery"
|
||||
android:layout_width="0px"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center"
|
||||
android:text="--%"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/black"
|
||||
android:textSize="12sp"
|
||||
android:textStyle="bold"
|
||||
android:visibility="gone"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/basal_rate"
|
||||
android:layout_width="0px"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:layout_weight="1.7"
|
||||
android:gravity="center"
|
||||
android:text="@string/no_tmp_basal_u_h"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/black"
|
||||
android:textSize="12sp"
|
||||
android:textStyle="bold" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/bgi"
|
||||
android:layout_width="0px"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/black"
|
||||
android:textSize="12sp"
|
||||
android:textStyle="bold"
|
||||
android:visibility="gone"
|
||||
tools:text="bgi" />
|
||||
|
||||
<View
|
||||
android:id="@+id/AAPSv2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:visibility="gone" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/tertiary_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_gravity="center"
|
||||
android:layout_weight="0.22"
|
||||
android:background="@color/black"
|
||||
android:baselineAligned="false"
|
||||
android:gravity="center"
|
||||
android:orientation="horizontal"
|
||||
android:padding="1dp"
|
||||
android:weightSum="7">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:baselineAligned="false"
|
||||
android:gravity="center"
|
||||
android:orientation="vertical"
|
||||
android:textAlignment="center">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/cob1"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:text="@string/activity_carb"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="10sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="SmallSp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/cob2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:text="@string/no_cob_g"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="14sp"
|
||||
android:textStyle="bold" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<View
|
||||
android:layout_width="0px"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/time"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="30sp"
|
||||
tools:text="12:00" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/date_time"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:orientation="vertical"
|
||||
android:textAlignment="center"
|
||||
android:visibility="gone">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/day"
|
||||
android:layout_width="23dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="10sp"
|
||||
tools:ignore="SmallSp"
|
||||
tools:text="day" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/month"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="10sp"
|
||||
tools:ignore="SmallSp"
|
||||
tools:text="mth" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<View
|
||||
android:layout_width="0px"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:orientation="vertical"
|
||||
android:textAlignment="center">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/iob1"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:text="@string/activity_IOB"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="10sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="SmallSp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/iob2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:text="@string/no_iob_u"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="14sp"
|
||||
android:textStyle="bold" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<lecho.lib.hellocharts.view.LineChartView
|
||||
android:id="@+id/chart"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_gravity="bottom"
|
||||
android:layout_weight="0.41"
|
||||
android:gravity="center_horizontal|top" />
|
||||
|
||||
</LinearLayout>
|
|
@ -1,136 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/main_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@color/black"
|
||||
android:orientation="vertical"
|
||||
android:textAlignment="center"
|
||||
tools:context=".watchfaces.AapsWatchface"
|
||||
tools:deviceIds="wear_square"
|
||||
tools:ignore="MissingDefaultResource">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="147dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:orientation="horizontal"
|
||||
android:paddingTop="15dp"
|
||||
android:textAlignment="center"
|
||||
android:weightSum="1">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/sgv"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="55dp"
|
||||
android:layout_gravity="bottom"
|
||||
android:gravity="bottom"
|
||||
android:text="---"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="50sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:baselineAligned="false"
|
||||
android:orientation="vertical"
|
||||
android:textAlignment="center"
|
||||
android:weightSum="1">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/direction"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal|bottom"
|
||||
android:gravity="center_horizontal|bottom"
|
||||
android:paddingTop="1dp"
|
||||
android:text="--"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="27sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/delta"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom"
|
||||
android:gravity="center_horizontal"
|
||||
android:text="@string/delta_na"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="10sp"
|
||||
tools:ignore="SmallSp" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/secondary_layout"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:background="@color/light_grey"
|
||||
android:orientation="horizontal"
|
||||
android:padding="2dp"
|
||||
android:textAlignment="center">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/timestamp"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/time_stamp_na_min_ago"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/black"
|
||||
android:textSize="12sp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/uploader_battery"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="10sp"
|
||||
android:paddingEnd="0sp"
|
||||
android:text="@string/uploader_na"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/black"
|
||||
android:textSize="12sp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/raw"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="10sp"
|
||||
android:paddingEnd="0sp"
|
||||
android:text=""
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/black"
|
||||
android:textSize="12sp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/status"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="10sp"
|
||||
android:paddingEnd="0sp"
|
||||
android:text="@string/no_status"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/black"
|
||||
android:textSize="12sp" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/time"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal|top"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="55sp"
|
||||
tools:text="12:00" />
|
||||
|
||||
</LinearLayout>
|
|
@ -1,103 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/main_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@color/black"
|
||||
android:gravity="center_horizontal"
|
||||
android:orientation="vertical"
|
||||
android:textAlignment="center"
|
||||
tools:context=".watchfaces.AapsWatchface"
|
||||
tools:deviceIds="wear_square"
|
||||
tools:ignore="MissingDefaultResource">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginTop="-5dp"
|
||||
android:gravity="center_horizontal"
|
||||
android:orientation="horizontal"
|
||||
android:paddingTop="5dp"
|
||||
android:textAlignment="center">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/delta"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom"
|
||||
android:layout_marginEnd="5dp"
|
||||
android:gravity="center_horizontal|bottom"
|
||||
android:text="---"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="40sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/sgv"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:gravity="center_horizontal"
|
||||
android:text="---"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="55sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/avg_delta"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom"
|
||||
android:layout_marginStart="5dp"
|
||||
android:gravity="center_horizontal|bottom"
|
||||
android:text="---"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="40sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/status"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
tools:text="E xU/h IOB: x (x+x)"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="24sp" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_horizontal|bottom"
|
||||
android:orientation="horizontal"
|
||||
android:textAlignment="center">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/time"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginEnd="6dp"
|
||||
tools:text="12:00"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="47sp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/timestamp"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:text="-- '"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="35sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
|
@ -1,112 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/main_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@color/black"
|
||||
android:gravity="center_vertical|center_horizontal"
|
||||
android:orientation="vertical"
|
||||
android:textAlignment="center"
|
||||
tools:context=".watchfaces.NoChartWatchface"
|
||||
tools:deviceIds="wear_square"
|
||||
tools:ignore="MissingDefaultResource">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginTop="-5dp"
|
||||
android:gravity="center_horizontal"
|
||||
android:orientation="horizontal"
|
||||
android:paddingTop="5dp"
|
||||
android:textAlignment="center">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/delta"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="bottom"
|
||||
android:layout_marginEnd="5dp"
|
||||
android:gravity="center_vertical|center_horizontal|center"
|
||||
android:text="---"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="24sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/sgv"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:gravity="center_horizontal"
|
||||
android:text="---"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="45sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/avg_delta"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginStart="5dp"
|
||||
android:gravity="center_vertical|center_horizontal|center"
|
||||
android:text=" ---"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="26sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<View
|
||||
android:id="@+id/dummy1"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="2dp"
|
||||
android:layout_gravity="bottom"
|
||||
android:gravity="center_horizontal" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/status"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:paddingBottom="2dp"
|
||||
android:text="@string/no_loop_status"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="21sp" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_horizontal|bottom"
|
||||
android:orientation="horizontal"
|
||||
android:textAlignment="center">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/time"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginEnd="6dp"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="45sp"
|
||||
tools:text="23:24" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/timestamp"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical|center_horizontal"
|
||||
android:text="--'"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="24sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
|
@ -1,381 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/main_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".watchfaces.SteampunkWatchface"
|
||||
tools:deviceIds="wear_round"
|
||||
tools:ignore="MissingDefaultResource">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/glucose_dial"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:importantForAccessibility="no"
|
||||
android:src="@drawable/steampunk_dial_mgdl" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/secondary_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:background="@drawable/steampunk_gauge_mgdl_20"
|
||||
android:gravity="center"
|
||||
android:orientation="vertical"
|
||||
android:weightSum="1">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/delta_pointer"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="0px"
|
||||
android:layout_gravity="center"
|
||||
android:layout_weight="0.69"
|
||||
android:gravity="center"
|
||||
android:src="@drawable/steampunk_pointer" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical"
|
||||
android:weightSum="1">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/main_menu_tap"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_weight="0.7"
|
||||
android:orientation="vertical"
|
||||
android:weightSum="1">
|
||||
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_weight="0.05"
|
||||
tools:ignore="NestedWeights" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_gravity="center"
|
||||
android:layout_weight="0.26"
|
||||
android:gravity="center"
|
||||
android:orientation="horizontal"
|
||||
android:weightSum="1">
|
||||
|
||||
<TextView
|
||||
android:layout_width="0px"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:layout_weight="0.2"
|
||||
android:gravity="center"
|
||||
android:textSize="11sp"
|
||||
android:textStyle="bold" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="0px"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="0.165"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/cob2"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:paddingTop="7dp"
|
||||
android:rotation="-28"
|
||||
android:text="@string/no_cob_g"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/black_86p"
|
||||
android:textSize="13sp"
|
||||
android:textStyle="bold" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="0px"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="0.27"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/basalRate"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:paddingBottom="14dp"
|
||||
android:rotation="0"
|
||||
android:text="@string/no_tmp_basal_u_h"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/black_86p"
|
||||
android:textSize="13sp"
|
||||
android:textStyle="bold" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="0px"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="0.165"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/iob2"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:paddingTop="6dp"
|
||||
android:rotation="28"
|
||||
android:text="@string/no_iob_u"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/black_86p"
|
||||
android:textSize="13sp"
|
||||
android:textStyle="bold" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:layout_width="0px"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:layout_weight="0.2"
|
||||
android:gravity="center"
|
||||
android:textSize="11sp"
|
||||
android:textStyle="bold" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/chart_zoom_tap"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_weight="0.27"
|
||||
android:orientation="horizontal"
|
||||
android:weightSum="1">
|
||||
|
||||
<View
|
||||
android:layout_width="0px"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="0.25"
|
||||
tools:ignore="NestedWeights" />
|
||||
|
||||
<lecho.lib.hellocharts.view.LineChartView
|
||||
android:id="@+id/chart"
|
||||
android:layout_width="0px"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="0.5" />
|
||||
|
||||
<View
|
||||
android:layout_width="0px"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="0.25"
|
||||
android:orientation="horizontal" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_weight="0.03" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/tertiary_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:orientation="vertical"
|
||||
android:weightSum="1">
|
||||
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_weight="0.15" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_gravity="center"
|
||||
android:layout_weight="0.21"
|
||||
android:baselineAligned="false"
|
||||
android:gravity="center"
|
||||
android:orientation="horizontal"
|
||||
android:weightSum="1">
|
||||
|
||||
<View
|
||||
android:layout_width="0px"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="0.32"
|
||||
tools:ignore="NestedWeights" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="0px"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="0.12"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/loop"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:paddingStart="0dp"
|
||||
android:paddingTop="8dp"
|
||||
android:paddingEnd="8dp"
|
||||
android:rotation="-24"
|
||||
android:text="-'"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/black_86p"
|
||||
android:textSize="12sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="0px"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:layout_weight="0.12"
|
||||
android:gravity="center"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/rig_battery"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:text="--%"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/black_86p"
|
||||
android:textSize="12sp"
|
||||
android:textStyle="bold"
|
||||
android:visibility="gone"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/uploader_battery"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:text="--%"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/black_86p"
|
||||
android:textSize="12sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="0px"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="0.12"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/timestamp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:paddingStart="10dp"
|
||||
android:paddingTop="8dp"
|
||||
android:paddingEnd="0dp"
|
||||
android:rotation="24"
|
||||
android:text="-'"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/black_86p"
|
||||
android:textSize="12sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<View
|
||||
android:layout_width="0px"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="0.32" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_weight="0.64" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/cover_plate_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@drawable/steampunk_cover_plate"
|
||||
android:orientation="vertical" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:orientation="vertical"
|
||||
android:weightSum="1">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/hour_hand"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="0px"
|
||||
android:layout_weight="0.3"
|
||||
android:orientation="vertical"
|
||||
android:rotation="0"
|
||||
android:src="@drawable/steampunk_hour_hand" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:orientation="vertical"
|
||||
android:weightSum="1">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/minute_hand"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="0px"
|
||||
android:layout_weight="0.3"
|
||||
android:orientation="vertical"
|
||||
android:src="@drawable/steampunk_minute_hand" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<View
|
||||
android:id="@+id/AAPSv2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:visibility="gone" />
|
||||
|
||||
</RelativeLayout>
|
|
@ -1,107 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/main_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@color/black"
|
||||
android:orientation="vertical"
|
||||
android:textAlignment="center"
|
||||
tools:context=".watchfaces.AapsWatchface"
|
||||
tools:deviceIds="wear_square"
|
||||
tools:ignore="MissingDefaultResource">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginTop="-2dp"
|
||||
android:gravity="center_horizontal"
|
||||
android:orientation="horizontal"
|
||||
android:paddingTop="5dp"
|
||||
android:textAlignment="center">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/delta"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom"
|
||||
android:layout_marginEnd="5dp"
|
||||
android:gravity="center_horizontal|bottom"
|
||||
android:text="---"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="30sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/sgv"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:gravity="center_horizontal"
|
||||
android:text="---"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="41sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/avg_delta"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom"
|
||||
android:layout_marginStart="5dp"
|
||||
android:gravity="center_horizontal|bottom"
|
||||
android:text="---"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="30sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<lecho.lib.hellocharts.view.LineChartView
|
||||
android:id="@+id/chart"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_gravity="bottom"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center_horizontal" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/status"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="18sp"
|
||||
tools:text="E xU/h IOB: x (x+x)" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_horizontal"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/time"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginEnd="6dp"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="35sp"
|
||||
tools:text="12:00" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/timestamp"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:text="-- '"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="26sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
|
@ -1,113 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/main_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@color/black"
|
||||
android:orientation="vertical"
|
||||
android:textAlignment="center"
|
||||
tools:context=".watchfaces.AapsWatchface"
|
||||
tools:deviceIds="wear_square"
|
||||
tools:ignore="MissingDefaultResource">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginTop="-5dp"
|
||||
android:gravity="center_horizontal"
|
||||
android:orientation="horizontal"
|
||||
android:paddingTop="5dp"
|
||||
android:textAlignment="center">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/delta"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical|center_horizontal|center"
|
||||
android:layout_marginEnd="5dp"
|
||||
android:gravity="center_horizontal|bottom"
|
||||
android:text="---"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="24sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/sgv"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:gravity="center_horizontal"
|
||||
android:text="---"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="34sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/avg_delta"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical|center_horizontal|center"
|
||||
android:layout_marginStart="5dp"
|
||||
android:gravity="center_horizontal|bottom"
|
||||
android:text="---"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="24sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/status"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginTop="-5sp"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="18sp"
|
||||
tools:text="E xU/h IOB: x (x+x)" />
|
||||
|
||||
<lecho.lib.hellocharts.view.LineChartView
|
||||
android:id="@+id/chart"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_gravity="bottom"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center_horizontal" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="-5sp"
|
||||
android:gravity="center_horizontal"
|
||||
android:orientation="horizontal"
|
||||
android:textAlignment="center">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/time"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginEnd="6dp"
|
||||
android:paddingTop="-5sp"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="34sp"
|
||||
tools:text="12:00" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/timestamp"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical|center_horizontal|center"
|
||||
android:text="--'"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="24sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
|
@ -1,164 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/main_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@color/black"
|
||||
android:orientation="vertical"
|
||||
android:textAlignment="center"
|
||||
android:weightSum="1"
|
||||
tools:context=".watchfaces.AapsWatchface"
|
||||
tools:deviceIds="wear_round"
|
||||
tools:ignore="MissingDefaultResource">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginTop="-5dp"
|
||||
android:gravity="center_horizontal"
|
||||
android:orientation="horizontal"
|
||||
android:paddingTop="15dp"
|
||||
android:textAlignment="center"
|
||||
android:weightSum="1">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/sgv"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal|bottom"
|
||||
android:layout_marginBottom="-2dp"
|
||||
android:gravity="bottom|end"
|
||||
android:paddingStart="0dp"
|
||||
android:paddingTop="-2dp"
|
||||
android:paddingEnd="5dp"
|
||||
android:text="---"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="41sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="fill_parent"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:baselineAligned="false"
|
||||
android:orientation="vertical"
|
||||
android:textAlignment="center"
|
||||
android:weightSum="1">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/direction"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal|bottom"
|
||||
android:layout_marginTop="-2dp"
|
||||
android:layout_marginBottom="-5dp"
|
||||
android:gravity="center_horizontal|bottom"
|
||||
android:text="--"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="30sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/delta"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom"
|
||||
android:gravity="center_horizontal|bottom"
|
||||
android:text="@string/delta_na"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="10sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="SmallSp" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/secondary_layout"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@color/light_grey"
|
||||
android:orientation="vertical"
|
||||
android:padding="1dp">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/timestamp"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/time_stamp_na_min_ago"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/black"
|
||||
android:textSize="8sp"
|
||||
tools:ignore="SmallSp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/uploader_battery"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="10sp"
|
||||
android:paddingEnd="0sp"
|
||||
android:text="@string/uploader_na"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/black"
|
||||
android:textSize="8sp"
|
||||
tools:ignore="SmallSp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/raw"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="10sp"
|
||||
android:paddingEnd="0sp"
|
||||
android:text=""
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/black"
|
||||
android:textSize="8sp"
|
||||
tools:ignore="SmallSp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/status"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="10sp"
|
||||
android:paddingEnd="0sp"
|
||||
android:text="@string/no_status"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/black"
|
||||
android:textSize="8sp"
|
||||
tools:ignore="SmallSp" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/time"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginTop="-2dp"
|
||||
android:layout_marginBottom="-3dp"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="30sp"
|
||||
tools:text="12:00" />
|
||||
|
||||
<lecho.lib.hellocharts.view.LineChartView
|
||||
android:id="@+id/chart"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="77dp"
|
||||
android:layout_gravity="bottom"
|
||||
android:gravity="center_horizontal|top" />
|
||||
|
||||
</LinearLayout>
|
|
@ -1,138 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/main_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@color/black"
|
||||
android:orientation="vertical"
|
||||
android:textAlignment="center"
|
||||
tools:context=".watchfaces.AapsWatchface"
|
||||
tools:deviceIds="wear_round"
|
||||
tools:ignore="MissingDefaultResource">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="147dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:gravity="center_vertical|center_horizontal"
|
||||
android:orientation="horizontal"
|
||||
android:paddingTop="30dp"
|
||||
android:textAlignment="center">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/sgv"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="0dp"
|
||||
android:paddingEnd="10dp"
|
||||
android:paddingBottom="3dp"
|
||||
android:text="8.8"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="50sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="fill_parent"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:baselineAligned="false"
|
||||
android:orientation="vertical"
|
||||
android:textAlignment="center"
|
||||
android:weightSum="1">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/direction"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal|bottom"
|
||||
android:gravity="center_horizontal|bottom"
|
||||
android:paddingTop="1dp"
|
||||
android:text="--"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="27sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/delta"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom"
|
||||
android:gravity="center_horizontal"
|
||||
android:text="@string/delta_na"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="10sp"
|
||||
tools:ignore="SmallSp" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/secondary_layout"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:background="@color/light_grey"
|
||||
android:gravity="center_horizontal"
|
||||
android:orientation="horizontal"
|
||||
android:padding="2dp">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/timestamp"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="--'"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/black"
|
||||
android:textSize="14sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/uploader_battery"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="10sp"
|
||||
android:paddingEnd="0sp"
|
||||
android:text="@string/uploader_na"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/black"
|
||||
android:textSize="14sp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/raw"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="10sp"
|
||||
android:paddingEnd="0sp"
|
||||
android:text=""
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/black"
|
||||
android:textSize="14sp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/status"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="10sp"
|
||||
android:paddingEnd="0sp"
|
||||
android:text="@string/no_status"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/black"
|
||||
android:textSize="14sp" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/time"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal|top"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="55sp"
|
||||
tools:text="12:00" />
|
||||
|
||||
</LinearLayout>
|
|
@ -1,101 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/main_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@color/black"
|
||||
android:gravity="center_vertical|center_horizontal"
|
||||
android:orientation="vertical"
|
||||
android:textAlignment="center"
|
||||
tools:context=".watchfaces.NoChartWatchface"
|
||||
tools:deviceIds="wear_square"
|
||||
tools:ignore="MissingDefaultResource">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginTop="-15dp"
|
||||
android:gravity="center_horizontal"
|
||||
android:orientation="horizontal"
|
||||
android:textAlignment="center">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/delta"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom"
|
||||
android:layout_marginEnd="5dp"
|
||||
android:gravity="center_horizontal|bottom"
|
||||
android:text="---"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="40sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/sgv"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:gravity="center_horizontal"
|
||||
android:text="---"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="55sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/avg_delta"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom"
|
||||
android:layout_marginStart="5dp"
|
||||
android:gravity="center_horizontal|bottom"
|
||||
android:text="---"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="40sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/status"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="24sp"
|
||||
tools:text="E xU/h IOB: x (x+x)" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_horizontal|bottom"
|
||||
android:orientation="horizontal"
|
||||
android:textAlignment="center">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/time"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginEnd="6dp"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="47sp"
|
||||
tools:text="12:00" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/timestamp"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:text="-- '"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="35sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
|
@ -1,114 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/main_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@color/black"
|
||||
android:gravity="center_vertical|center_horizontal"
|
||||
android:orientation="vertical"
|
||||
tools:context=".watchfaces.AapsWatchface"
|
||||
tools:deviceIds="wear_square"
|
||||
tools:ignore="MissingDefaultResource">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginTop="-15dp"
|
||||
android:layout_marginBottom="5dp"
|
||||
android:gravity="center_horizontal"
|
||||
android:orientation="horizontal"
|
||||
android:paddingTop="5dp"
|
||||
android:textAlignment="center">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/delta"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="bottom"
|
||||
android:layout_marginEnd="5dp"
|
||||
android:layout_marginBottom="-15dp"
|
||||
android:gravity="center_vertical|center_horizontal|center"
|
||||
android:text="---"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="22sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/sgv"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:gravity="center_horizontal"
|
||||
android:text="---"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="42sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/avg_delta"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginStart="5dp"
|
||||
android:layout_marginBottom="-15dp"
|
||||
android:gravity="center_vertical|center_horizontal|center"
|
||||
android:text=" ---"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="22sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<View
|
||||
android:id="@+id/dummy1"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="2dp"
|
||||
android:layout_gravity="bottom"
|
||||
android:gravity="center_horizontal" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/status"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:paddingBottom="2dp"
|
||||
android:text="@string/no_loop_status"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="21sp" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_horizontal|bottom"
|
||||
android:orientation="horizontal"
|
||||
android:textAlignment="center">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/time"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginEnd="6dp"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="43sp"
|
||||
tools:text="23:24" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/timestamp"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical|center_horizontal"
|
||||
android:text="--'"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="24sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
|
@ -11,11 +11,11 @@
|
|||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:layout_margin="10sp"
|
||||
android:layout_margin="10dp"
|
||||
android:background="@drawable/circle"
|
||||
android:backgroundTint="@color/white"
|
||||
android:contentDescription="@string/action_confirm"
|
||||
android:padding="25sp"
|
||||
android:padding="25dp"
|
||||
android:src="@drawable/ic_confirm"
|
||||
app:tint="@color/white" />
|
||||
|
||||
|
|
111
wear/src/main/res/layout/activity_bigchart.xml
Normal file
|
@ -0,0 +1,111 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/main_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical"
|
||||
android:textAlignment="center"
|
||||
tools:context=".watchfaces.BigChartWatchface">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/linearLayout3"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/delta"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom"
|
||||
android:gravity="bottom"
|
||||
android:textSize="@dimen/watch_face_big_chart_delta_text_size"
|
||||
tools:text="---" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/sgv"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="4dp"
|
||||
android:textSize="@dimen/watch_face_big_chart_svg_text_size"
|
||||
tools:text="---" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/avg_delta"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom"
|
||||
android:textSize="@dimen/watch_face_big_chart_delta_text_size"
|
||||
tools:text="---" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<lecho.lib.hellocharts.view.LineChartView
|
||||
android:id="@+id/chart"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginTop="-4dp"
|
||||
app:layout_constraintBottom_toTopOf="@+id/status"
|
||||
app:layout_constraintTop_toBottomOf="@+id/linearLayout3" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/status"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="-7dp"
|
||||
android:textSize="@dimen/watch_face_status_text_size"
|
||||
app:layout_constraintBottom_toTopOf="@+id/linearLayout2"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
tools:text="E xU/h IOB: x (x+x)" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/linearLayout2"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_horizontal"
|
||||
android:paddingBottom="6dp"
|
||||
app:layout_constraintBottom_toBottomOf="parent">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/time"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginEnd="2dp"
|
||||
android:textSize="@dimen/watch_face_time_text_size"
|
||||
tools:text="12:00" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/timestamp"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="6dp"
|
||||
android:maxLines="1"
|
||||
android:textSize="@dimen/watch_face_timestamp_text_size"
|
||||
tools:text="5'" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/timePeriod"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="start"
|
||||
android:layout_marginTop="-5dp"
|
||||
android:textSize="@dimen/watch_face_time_period_text_size"
|
||||
android:textStyle="bold"
|
||||
tools:text="AM" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
|
@ -6,7 +6,8 @@
|
|||
android:layout_alignParentStart="true"
|
||||
android:layout_alignParentTop="true"
|
||||
android:gravity="center_vertical|center_horizontal"
|
||||
android:orientation="vertical">
|
||||
android:orientation="vertical"
|
||||
tools:context=".watchfaces.CircleWatchface">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/agoString"
|
||||
|
|
|
@ -5,9 +5,7 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@drawable/airplane_cockpit_outside_clouds"
|
||||
tools:context=".watchfaces.CockpitWatchface"
|
||||
tools:deviceIds="wear_round"
|
||||
tools:ignore="MissingDefaultResource">
|
||||
tools:context=".watchfaces.CockpitWatchface">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/inside"
|
|
@ -5,18 +5,15 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@color/black"
|
||||
tools:deviceIds="wear_round"
|
||||
tools:ignore="MissingDefaultResource">
|
||||
tools:context=".watchfaces.DigitalStyleWatchface">
|
||||
|
||||
<!-- background-image with shapes elements-->
|
||||
<LinearLayout
|
||||
android:id="@+id/shapes_elements"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@drawable/digitalstyle_bg_full_round"
|
||||
android:contentDescription="round-shape-elements"
|
||||
android:orientation="horizontal"
|
||||
tools:ignore="HardcodedText" />
|
||||
android:background="@drawable/digital_style_bg_full"
|
||||
android:orientation="horizontal" />
|
||||
|
||||
<!-- root-element-->
|
||||
<LinearLayout
|
||||
|
@ -66,6 +63,7 @@
|
|||
android:id="@+id/cob1"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginTop="1dp"
|
||||
android:layout_weight="2"
|
||||
android:fontFamily="@font/roboto_slab_light"
|
||||
android:gravity="bottom|center_horizontal"
|
||||
|
@ -78,6 +76,7 @@
|
|||
android:id="@+id/cob2"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginTop="-1dp"
|
||||
android:layout_weight="3"
|
||||
android:fontFamily="@font/roboto_slab_light"
|
||||
android:gravity="top|center_horizontal"
|
||||
|
@ -85,7 +84,7 @@
|
|||
android:lines="1"
|
||||
android:text="@string/cob_000g"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="14sp" />
|
||||
android:textSize="@dimen/watch_face_digital_sub_text_size" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
@ -150,7 +149,7 @@
|
|||
android:text="--"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="16sp"
|
||||
android:textSize="@dimen/watch_face_digital_direction_text_size"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
|
@ -163,9 +162,10 @@
|
|||
android:layout_marginBottom="2dp"
|
||||
android:layout_weight="3"
|
||||
android:fontFamily="sans-serif-condensed-light"
|
||||
android:maxLines="1"
|
||||
android:text="--'"
|
||||
android:textColor="@color/light_grey"
|
||||
android:textSize="10sp"
|
||||
android:textSize="@dimen/watch_face_digital_timestamp_text_size"
|
||||
tools:ignore="HardcodedText,SmallSp" />
|
||||
|
||||
<View
|
||||
|
@ -196,7 +196,7 @@
|
|||
android:lines="1"
|
||||
android:text="@string/svg_00_0"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="20sp"
|
||||
android:textSize="@dimen/watch_face_digital_svg_text_size"
|
||||
android:textStyle="bold" />
|
||||
|
||||
</LinearLayout>
|
||||
|
@ -240,6 +240,7 @@
|
|||
android:id="@+id/iob1"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginTop="1dp"
|
||||
android:layout_weight="2"
|
||||
android:fontFamily="@font/roboto_slab_light"
|
||||
android:gravity="bottom|center_horizontal"
|
||||
|
@ -252,14 +253,16 @@
|
|||
android:id="@+id/iob2"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginTop="-1dp"
|
||||
android:layout_weight="3"
|
||||
android:fontFamily="@font/roboto_slab_light"
|
||||
android:gravity="top|center_horizontal"
|
||||
|
||||
android:letterSpacing="-0.075"
|
||||
android:lines="1"
|
||||
android:text="@string/iob_0_00u"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="14sp" />
|
||||
android:textSize="@dimen/watch_face_digital_sub_text_size" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
@ -342,7 +345,6 @@
|
|||
android:textColor="@color/light_grey"
|
||||
android:textFontWeight="400"
|
||||
android:textSize="18sp"
|
||||
android:visibility="gone"
|
||||
tools:text="ww" />
|
||||
|
||||
<View
|
||||
|
@ -439,8 +441,9 @@
|
|||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="start"
|
||||
android:layout_marginStart="6sp"
|
||||
android:layout_marginBottom="-8sp"
|
||||
android:layout_marginStart="6dp"
|
||||
android:layout_marginTop="-2dp"
|
||||
android:layout_marginBottom="-8dp"
|
||||
android:fontFamily="@font/roboto_condensed_bold"
|
||||
android:textColor="@color/light_grey"
|
||||
android:textSize="26sp"
|
||||
|
@ -452,7 +455,7 @@
|
|||
android:id="@+id/timePeriod"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="8sp"
|
||||
android:layout_marginStart="8dp"
|
||||
android:fontFamily="@font/roboto_condensed_bold"
|
||||
android:gravity="top"
|
||||
android:textColor="@color/light_grey"
|
135
wear/src/main/res/layout/activity_home.xml
Normal file
|
@ -0,0 +1,135 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/main_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".watchfaces.AapsWatchface">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/linearLayout"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintBottom_toTopOf="@+id/secondary_layout"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/sgv"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="5dp"
|
||||
android:gravity="bottom"
|
||||
android:textSize="41sp"
|
||||
tools:text="---" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/direction"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:textSize="25sp"
|
||||
android:textStyle="bold"
|
||||
tools:text="--" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/delta"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:textSize="11sp"
|
||||
android:textStyle="bold"
|
||||
tools:text="1" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/secondary_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:background="?android:colorForeground"
|
||||
android:gravity="center_horizontal"
|
||||
android:paddingVertical="1dp"
|
||||
app:layout_constraintBottom_toTopOf="@+id/time">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/timestamp"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAlignment="center"
|
||||
android:textColor="?android:textColorPrimaryInverse"
|
||||
android:textSize="11sp"
|
||||
android:textStyle="bold"
|
||||
tools:text="@string/time_stamp_na_min_ago" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/uploader_battery"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="10sp"
|
||||
android:paddingEnd="0sp"
|
||||
android:textAlignment="center"
|
||||
android:textColor="?android:textColorPrimaryInverse"
|
||||
android:textSize="11sp"
|
||||
android:textStyle="bold"
|
||||
tools:text="@string/uploader_na" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/raw"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="10sp"
|
||||
android:paddingEnd="0sp"
|
||||
android:textAlignment="center"
|
||||
android:textColor="?android:textColorPrimaryInverse"
|
||||
android:textSize="11sp"
|
||||
android:textStyle="bold"
|
||||
tools:text="" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/status"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="10sp"
|
||||
android:paddingEnd="0sp"
|
||||
android:textAlignment="center"
|
||||
android:textColor="?android:textColorPrimaryInverse"
|
||||
android:textSize="11sp"
|
||||
android:textStyle="bold"
|
||||
tools:text="@string/no_status" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/time"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal|top"
|
||||
android:textAlignment="center"
|
||||
|
||||
android:textSize="35sp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:text="12:00" />
|
||||
|
||||
<lecho.lib.hellocharts.view.LineChartView
|
||||
android:id="@+id/chart"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginTop="-5dp"
|
||||
android:paddingBottom="7dp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/time" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
|
@ -1,96 +1,64 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/main_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@color/black"
|
||||
android:orientation="vertical"
|
||||
android:textAlignment="center"
|
||||
android:weightSum="1.1"
|
||||
tools:context=".watchfaces.AapsV2Watchface"
|
||||
tools:deviceIds="wear_round"
|
||||
tools:ignore="MissingDefaultResource">
|
||||
|
||||
<View
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="0px"
|
||||
android:layout_weight="0.05"
|
||||
android:orientation="vertical" />
|
||||
tools:context=".watchfaces.AapsV2Watchface">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/primary_layout"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_weight="0.27"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="5dp"
|
||||
android:gravity="center_horizontal"
|
||||
android:orientation="horizontal"
|
||||
android:textAlignment="center">
|
||||
app:layout_constraintBottom_toTopOf="@+id/secondary_layout"
|
||||
app:layout_constraintTop_toTopOf="parent">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/loop"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom|center"
|
||||
android:layout_gravity="bottom"
|
||||
android:background="@drawable/loop_grey_25"
|
||||
android:gravity="center"
|
||||
android:text="--'"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="14sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="HardcodedText" />
|
||||
tools:text="--'" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/sgv"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal|bottom"
|
||||
android:layout_gravity=""
|
||||
android:layout_marginBottom="-2dp"
|
||||
android:gravity="bottom|end"
|
||||
android:paddingStart="5dp"
|
||||
android:paddingTop="-2dp"
|
||||
android:paddingEnd="5dp"
|
||||
android:text="---"
|
||||
android:textColor="@color/white"
|
||||
android:paddingHorizontal="5dp"
|
||||
android:textSize="38sp"
|
||||
tools:ignore="HardcodedText" />
|
||||
tools:text="---" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="fill_parent"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:baselineAligned="false"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="vertical"
|
||||
android:paddingStart="0dp"
|
||||
android:paddingEnd="4dp">
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/direction"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal|bottom"
|
||||
android:gravity="center_horizontal|bottom"
|
||||
android:text="--"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="22sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="HardcodedText" />
|
||||
tools:text="--" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/timestamp"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="2dp"
|
||||
android:gravity="center"
|
||||
android:text="--'"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="14sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="HardcodedText" />
|
||||
tools:text="--'" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
@ -99,50 +67,39 @@
|
|||
<LinearLayout
|
||||
android:id="@+id/secondary_layout"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_gravity="center"
|
||||
android:layout_weight="0.10"
|
||||
android:background="@color/light_grey"
|
||||
android:gravity="center"
|
||||
android:orientation="vertical"
|
||||
android:padding="1dp">
|
||||
android:layout_height="wrap_content"
|
||||
android:background="?android:colorForeground"
|
||||
android:paddingVertical="1dp"
|
||||
app:layout_constraintBottom_toTopOf="@+id/tertiary_layout"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:orientation="horizontal"
|
||||
android:paddingStart="5dp"
|
||||
android:paddingEnd="5dp"
|
||||
android:textAlignment="center">
|
||||
android:paddingHorizontal="5dp">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/delta"
|
||||
android:layout_width="0px"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center"
|
||||
android:text="+/-"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/black"
|
||||
android:textColor="?android:textColorPrimaryInverse"
|
||||
android:textSize="13sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="HardcodedText" />
|
||||
tools:text="+/-" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/avg_delta"
|
||||
android:layout_width="0px"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center"
|
||||
android:text="@string/abbreviation_average"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/black"
|
||||
android:textColor="?android:textColorPrimaryInverse"
|
||||
android:textSize="13sp"
|
||||
android:textStyle="bold" />
|
||||
android:textStyle="bold"
|
||||
tools:text="@string/abbreviation_average" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/uploader_battery"
|
||||
|
@ -151,12 +108,11 @@
|
|||
android:layout_gravity="center"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center"
|
||||
android:text="--%"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/black"
|
||||
android:textColor="?android:textColorPrimaryInverse"
|
||||
android:textSize="13sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="HardcodedText" />
|
||||
tools:text="--%" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/rig_battery"
|
||||
|
@ -165,39 +121,34 @@
|
|||
android:layout_gravity="center"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center"
|
||||
android:text="--%"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/black"
|
||||
android:textColor="?android:textColorPrimaryInverse"
|
||||
android:textSize="13sp"
|
||||
android:textStyle="bold"
|
||||
android:visibility="gone"
|
||||
tools:ignore="HardcodedText" />
|
||||
android:visibility="visible"
|
||||
tools:text="--%" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/basalRate"
|
||||
android:layout_width="0px"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:layout_weight="1.7"
|
||||
android:gravity="center"
|
||||
android:text="@string/no_tmp_basal_u_h"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/black"
|
||||
android:textColor="?android:textColorPrimaryInverse"
|
||||
android:textSize="13sp"
|
||||
android:textStyle="bold" />
|
||||
android:textStyle="bold"
|
||||
tools:text="@string/no_tmp_basal_u_h" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/bgi"
|
||||
android:layout_width="0px"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/black"
|
||||
android:textColor="?android:textColorPrimaryInverse"
|
||||
android:textSize="13sp"
|
||||
android:textStyle="bold"
|
||||
android:visibility="gone"
|
||||
android:visibility="visible"
|
||||
tools:text="bgi" />
|
||||
|
||||
<View
|
||||
|
@ -213,46 +164,30 @@
|
|||
<LinearLayout
|
||||
android:id="@+id/tertiary_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_gravity="center"
|
||||
android:layout_weight="0.22"
|
||||
android:background="@color/black"
|
||||
android:baselineAligned="false"
|
||||
android:gravity="center"
|
||||
android:orientation="horizontal"
|
||||
android:padding="1dp"
|
||||
android:weightSum="7">
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_horizontal"
|
||||
android:weightSum="7"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:baselineAligned="false"
|
||||
android:gravity="center"
|
||||
android:orientation="vertical"
|
||||
android:textAlignment="center">
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/cob1"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:text="@string/activity_carb"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="10sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="SmallSp" />
|
||||
android:textSize="11sp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/cob2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:text="@string/no_cob_g"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="14sp"
|
||||
android:textStyle="bold" />
|
||||
|
||||
|
@ -268,10 +203,7 @@
|
|||
android:id="@+id/time"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="30sp"
|
||||
tools:text="12:00" />
|
||||
|
||||
|
@ -279,10 +211,8 @@
|
|||
android:id="@+id/date_time"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:orientation="vertical"
|
||||
android:textAlignment="center"
|
||||
android:visibility="gone">
|
||||
|
||||
<TextView
|
||||
|
@ -292,7 +222,6 @@
|
|||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="12sp"
|
||||
tools:text="day" />
|
||||
|
||||
|
@ -302,7 +231,6 @@
|
|||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="12sp"
|
||||
tools:text="mth" />
|
||||
|
||||
|
@ -327,12 +255,9 @@
|
|||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:text="@string/activity_IOB"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="10sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="SmallSp" />
|
||||
android:textSize="11sp"
|
||||
tools:text="@string/activity_IOB" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/iob2"
|
||||
|
@ -340,28 +265,21 @@
|
|||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:text="@string/no_iob_u"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="14sp"
|
||||
android:textStyle="bold" />
|
||||
android:textStyle="bold"
|
||||
tools:text="@string/no_iob_u" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<lecho.lib.hellocharts.view.LineChartView
|
||||
android:id="@+id/chart"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0px"
|
||||
android:layout_gravity="bottom"
|
||||
android:layout_weight="0.41"
|
||||
android:gravity="center_horizontal|top" />
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginTop="-5dp"
|
||||
android:layout_marginBottom="7dp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/tertiary_layout" />
|
||||
|
||||
<View
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="0px"
|
||||
android:layout_weight="0.05"
|
||||
android:orientation="vertical" />
|
||||
|
||||
</LinearLayout>
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
129
wear/src/main/res/layout/activity_home_large.xml
Normal file
|
@ -0,0 +1,129 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/main_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".watchfaces.AapsLargeWatchface">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintBottom_toTopOf="@+id/secondary_layout"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/sgv"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="0dp"
|
||||
android:paddingEnd="10dp"
|
||||
android:textSize="50sp"
|
||||
tools:text="18.8" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/direction"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="27sp"
|
||||
android:textStyle="bold"
|
||||
tools:text="--" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/delta"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_horizontal"
|
||||
android:textSize="11sp"
|
||||
tools:text="@string/delta_na" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/secondary_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="?android:colorForeground"
|
||||
android:gravity="center_horizontal"
|
||||
android:padding="2dp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/timestamp"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textColor="?android:textColorPrimaryInverse"
|
||||
android:textSize="@dimen/watch_face_large_status_size"
|
||||
tools:text="--'" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/uploader_battery"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="10sp"
|
||||
android:paddingEnd="0sp"
|
||||
android:textColor="?android:textColorPrimaryInverse"
|
||||
android:textSize="@dimen/watch_face_large_status_size"
|
||||
tools:text="@string/uploader_na" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/raw"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="10sp"
|
||||
android:paddingEnd="0sp"
|
||||
android:textColor="?android:textColorPrimaryInverse"
|
||||
android:textSize="@dimen/watch_face_large_status_size"
|
||||
tools:text="" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/status"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="10sp"
|
||||
android:paddingEnd="0sp"
|
||||
android:textColor="?android:textColorPrimaryInverse"
|
||||
android:textSize="14sp"
|
||||
tools:text="@string/no_status" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/secondary_layout">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/time"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="@dimen/watch_face_large_time_text_size"
|
||||
tools:text="01:00" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/timePeriod"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="15sp"
|
||||
android:layout_gravity="start"
|
||||
android:textSize="@dimen/watch_face_large_time_period_text_size"
|
||||
android:textStyle="bold"
|
||||
tools:text="AM" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
102
wear/src/main/res/layout/activity_nochart.xml
Normal file
|
@ -0,0 +1,102 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/main_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".watchfaces.NoChartWatchface">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingBottom="5dp"
|
||||
app:layout_constraintBottom_toTopOf="@+id/status"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/delta"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom"
|
||||
android:maxLines="1"
|
||||
android:textSize="@dimen/watch_face_delta_text_size"
|
||||
tools:text="+0.0" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/sgv"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:maxLines="1"
|
||||
android:paddingHorizontal="3dp"
|
||||
android:textSize="@dimen/watch_face_svg_text_size"
|
||||
tools:text="10.1" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/avg_delta"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom"
|
||||
android:maxLines="1"
|
||||
android:textSize="@dimen/watch_face_delta_text_size"
|
||||
tools:text="+0.0" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/status"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:maxLines="1"
|
||||
android:textSize="@dimen/watch_face_no_chart_status_size"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:text="E xU/h IOB: x (x+x)" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="5dp"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/status">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/time"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="6dp"
|
||||
android:textSize="@dimen/watch_face_time_text_size"
|
||||
tools:text="12:00" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/timestamp"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="7dp"
|
||||
android:maxLines="1"
|
||||
android:textSize="@dimen/watch_face_timestamp_text_size"
|
||||
tools:text="5'" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/timePeriod"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="-4dp"
|
||||
android:textSize="11sp"
|
||||
android:textStyle="bold"
|
||||
tools:text="AM" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
|
@ -4,9 +4,7 @@
|
|||
android:id="@+id/main_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".watchfaces.SteampunkWatchface"
|
||||
tools:deviceIds="wear_round"
|
||||
tools:ignore="MissingDefaultResource">
|
||||
tools:context=".watchfaces.SteampunkWatchface">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
|
@ -173,14 +171,14 @@
|
|||
<View
|
||||
android:layout_width="0px"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="0.25"
|
||||
android:layout_weight="0.2"
|
||||
tools:ignore="NestedWeights" />
|
||||
|
||||
<lecho.lib.hellocharts.view.LineChartView
|
||||
android:id="@+id/chart"
|
||||
android:layout_width="0px"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="0.5" />
|
||||
android:layout_weight="0.55" />
|
||||
|
||||
<View
|
||||
android:layout_width="0px"
|
27
wear/src/main/res/values-sw200dp/dimens.xml
Normal file
|
@ -0,0 +1,27 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<resources>
|
||||
<!-- Watch face sizes for bigger larger screen sizes -->
|
||||
<dimen name="watch_face_svg_text_size">50sp</dimen>
|
||||
<dimen name="watch_face_delta_text_size">25sp</dimen>
|
||||
<dimen name="watch_face_time_text_size">45sp</dimen>
|
||||
<dimen name="watch_face_timestamp_text_size">23sp</dimen>
|
||||
<dimen name="watch_face_time_period_text_size">12sp</dimen>
|
||||
<dimen name="watch_face_status_text_size">17sp</dimen>
|
||||
|
||||
<!-- Watch face specific-->
|
||||
<dimen name="watch_face_no_chart_status_size">24sp</dimen>
|
||||
<dimen name="watch_face_big_chart_svg_text_size">35sp</dimen>
|
||||
<dimen name="watch_face_big_chart_delta_text_size">29sp</dimen>
|
||||
<dimen name="watch_face_digital_svg_text_size">23sp</dimen>
|
||||
<dimen name="watch_face_digital_direction_text_size">17sp</dimen>
|
||||
<dimen name="watch_face_digital_timestamp_text_size">14sp</dimen>
|
||||
<dimen name="watch_face_digital_sub_text_size">15sp</dimen>
|
||||
|
||||
<dimen name="watch_face_large_svg_text_size">55sp</dimen>
|
||||
<dimen name="watch_face_large_direction_text_size">29sp</dimen>
|
||||
<dimen name="watch_face_large_delta_text_size">13sp</dimen>
|
||||
<dimen name="watch_face_large_time_text_size">55sp</dimen>
|
||||
<dimen name="watch_face_large_time_period_text_size">13sp</dimen>
|
||||
|
||||
</resources>
|
|
@ -1,8 +1,48 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<!--Watch Resources list of common watches with DP
|
||||
Screen density = Screen width (or height) in pixels / Screen width (or height) in inches
|
||||
dp = (width in pixels * 160) / screen density
|
||||
|
||||
Galaxy Watch 4 40mm: 1.2", 396 x 396 px = 192 dp
|
||||
Galaxy Watch 4 44mm: 1.4", 450 x 450 px = 224 dp
|
||||
Galaxy Watch 4 Classic 42mm: 1.19", 396 x 396 px = 190 dp
|
||||
Galaxy Watch 4 Classic 46mm: 1.4", 450 x 450 px = 224 dp
|
||||
Samsung Galaxy Watch 5 40mm: 1.2", 396 x 396 px = 192 dp
|
||||
Samsung Galaxy Watch 5 44mm: 1.4", 450 x 450 px = 224 dp
|
||||
TicWatch Pro 3: 1.39", 454 x 454 px = 222.4 dp
|
||||
Fossil Gen 5: 1.28", 416 x 416 px = 204.8
|
||||
Google Pixel Watch: 1.2", 450 x 450 px = 192 dp
|
||||
-->
|
||||
|
||||
<resources>
|
||||
<dimen name="simple_ui_svg_text_size">50sp</dimen>
|
||||
<dimen name="simple_ui_direction_text_size">35sp</dimen>
|
||||
<dimen name="simple_ui_time_text_size">35sp</dimen>
|
||||
<dimen name="simple_ui_y_offset">5dp</dimen>
|
||||
|
||||
<!-- Watch face sizes for small screen sizes -->
|
||||
<dimen name="watch_face_svg_text_size">40sp</dimen>
|
||||
<dimen name="watch_face_delta_text_size">20sp</dimen>
|
||||
<dimen name="watch_face_time_text_size">35sp</dimen>
|
||||
<dimen name="watch_face_timestamp_text_size">17sp</dimen>
|
||||
<dimen name="watch_face_time_period_text_size">11sp</dimen>
|
||||
<dimen name="watch_face_status_text_size">15sp</dimen>
|
||||
<!-- Watch face specific-->
|
||||
<dimen name="watch_face_no_chart_status_size">20sp</dimen>
|
||||
<dimen name="watch_face_big_chart_svg_text_size">30sp</dimen>
|
||||
<dimen name="watch_face_big_chart_delta_text_size">25sp</dimen>
|
||||
|
||||
<dimen name="watch_face_digital_svg_text_size">20sp</dimen>
|
||||
<dimen name="watch_face_digital_direction_text_size">16sp</dimen>
|
||||
<dimen name="watch_face_digital_timestamp_text_size">10sp</dimen>
|
||||
<dimen name="watch_face_digital_sub_text_size">14sp</dimen>
|
||||
|
||||
<dimen name="watch_face_large_svg_text_size">50sp</dimen>
|
||||
<dimen name="watch_face_large_direction_text_size">27sp</dimen>
|
||||
<dimen name="watch_face_large_delta_text_size">11sp</dimen>
|
||||
<dimen name="watch_face_large_time_text_size">50sp</dimen>
|
||||
<dimen name="watch_face_large_time_period_text_size">11sp</dimen>
|
||||
<dimen name="watch_face_large_status_size">14sp</dimen>
|
||||
|
||||
</resources>
|
||||
|
|
|
@ -216,9 +216,9 @@
|
|||
<string name="no_iob_u">--U</string>
|
||||
<string name="no_cob_g">--g</string>
|
||||
<string name="no_tmp_basal_u_h">-.--U/h</string>
|
||||
<string name="uploader_na">Uploader: ---%</string>
|
||||
<string name="no_status">S: no status</string>
|
||||
<string name="time_stamp_na_min_ago">-- Minutes ago</string>
|
||||
<string name="uploader_na">U: --%</string>
|
||||
<string name="no_status">S: --</string>
|
||||
<string name="time_stamp_na_min_ago">-- Min. ago</string>
|
||||
<string name="delta_na">--- mg/dl</string>
|
||||
<string name="no_loop_status">No Loop Status</string>
|
||||
<string name="cob_000g">000g</string>
|
||||
|
|