Wear CWF Include TimeStamp dynValue

This commit is contained in:
Philoul 2023-10-03 18:39:15 +02:00
parent acfc23ddf8
commit d74db007a7

View file

@ -53,6 +53,7 @@ import org.joda.time.TimeOfDay
import org.json.JSONObject import org.json.JSONObject
import java.io.ByteArrayOutputStream import java.io.ByteArrayOutputStream
import javax.inject.Inject import javax.inject.Inject
import kotlin.math.floor
@SuppressLint("UseCompatLoadingForDrawables") @SuppressLint("UseCompatLoadingForDrawables")
class CustomWatchface : BaseWatchFace() { class CustomWatchface : BaseWatchFace() {
@ -157,7 +158,7 @@ class CustomWatchface : BaseWatchFace() {
FontMap.init(this) FontMap.init(this)
ViewMap.init(this) ViewMap.init(this)
TrendArrowMap.init(this) TrendArrowMap.init(this)
DynProvider.init(this, json.optJSONObject(DYNDATA.key)) DynProvider.init(json.optJSONObject(DYNDATA.key))
} }
enableSecond = json.optBoolean(ENABLESECOND.key) && sp.getBoolean(R.string.key_show_seconds, true) enableSecond = json.optBoolean(ENABLESECOND.key) && sp.getBoolean(R.string.key_show_seconds, true)
highColor = getColor(json.optString(HIGHCOLOR.key), ContextCompat.getColor(this, R.color.dark_highColor)) highColor = getColor(json.optString(HIGHCOLOR.key), ContextCompat.getColor(this, R.color.dark_highColor))
@ -480,7 +481,7 @@ class CustomWatchface : BaseWatchFace() {
left = (viewJson.optInt(LEFTMARGIN.key) * cwf.zoomFactor).toInt() left = (viewJson.optInt(LEFTMARGIN.key) * cwf.zoomFactor).toInt()
top = (viewJson.optInt(TOPMARGIN.key) * cwf.zoomFactor).toInt() top = (viewJson.optInt(TOPMARGIN.key) * cwf.zoomFactor).toInt()
val params = FrameLayout.LayoutParams(width, height) val params = FrameLayout.LayoutParams(width, height)
dynData = DynProvider.getDyn(viewJson.optString(DYNDATA.key),width, height, key) dynData = DynProvider.getDyn(cwf, viewJson.optString(DYNDATA.key),width, height, key)
val topOffset = if (viewJson.optBoolean(TOPOFFSET.key, false)) dynData?.getTopOffset() ?:0 else 0 val topOffset = if (viewJson.optBoolean(TOPOFFSET.key, false)) dynData?.getTopOffset() ?:0 else 0
params.topMargin = top + topOffset params.topMargin = top + topOffset
val leftOffset = if (viewJson.optBoolean(LEFTOFFSET.key, false)) dynData?.getLeftOffset() ?:0 else 0 val leftOffset = if (viewJson.optBoolean(LEFTOFFSET.key, false)) dynData?.getLeftOffset() ?:0 else 0
@ -646,6 +647,7 @@ class CustomWatchface : BaseWatchFace() {
AVG_DELTA(ViewKeys.AVG_DELTA.key, -25.0, 25.0), AVG_DELTA(ViewKeys.AVG_DELTA.key, -25.0, 25.0),
UPLOADER_BATTERY(ViewKeys.UPLOADER_BATTERY.key, 0.0, 100.0), UPLOADER_BATTERY(ViewKeys.UPLOADER_BATTERY.key, 0.0, 100.0),
RIG_BATTERY(ViewKeys.RIG_BATTERY.key, 0.0, 100.0), RIG_BATTERY(ViewKeys.RIG_BATTERY.key, 0.0, 100.0),
TIMESTAMP(ViewKeys.TIMESTAMP.key, 0.0, 60.0),
LOOP(ViewKeys.LOOP.key, 0.0, 28.0), LOOP(ViewKeys.LOOP.key, 0.0, 28.0),
DAY(ViewKeys.DAY.key, 1.0, 31.0), DAY(ViewKeys.DAY.key, 1.0, 31.0),
DAY_NAME(ViewKeys.DAY_NAME.key, 1.0, 7.0), DAY_NAME(ViewKeys.DAY_NAME.key, 1.0, 7.0),
@ -664,9 +666,9 @@ class CustomWatchface : BaseWatchFace() {
fun stepValue(dataValue: Double, range: DataRange, step: Int): Int = step(dataValue, range, step) fun stepValue(dataValue: Double, range: DataRange, step: Int): Int = step(dataValue, range, step)
private fun step(dataValue: Double, dataRange: DataRange, step: Int): Int = when { private fun step(dataValue: Double, dataRange: DataRange, step: Int): Int = when {
dataValue < dataRange.minData -> dataRange.minData dataValue < dataRange.minData -> dataRange.minData
dataValue >= dataRange.maxData -> dataRange.maxData * 0.9999 // to avoid dataValue == maxData and be out of range dataValue >= dataRange.maxData -> dataRange.maxData * 0.9999 // to avoid dataValue == maxData and be out of range
else -> dataValue else -> dataValue
}.let { if (dataRange.minData != dataRange.maxData) (1 + ((it - dataRange.minData) * step) / (dataRange.maxData - dataRange.minData)).toInt() else 0 } }.let { if (dataRange.minData != dataRange.maxData) (1 + ((it - dataRange.minData) * step) / (dataRange.maxData - dataRange.minData)).toInt() else 0 }
companion object { companion object {
@ -675,7 +677,7 @@ class CustomWatchface : BaseWatchFace() {
} }
} }
private class DynProvider(val dataJson: JSONObject, val valueMap: ValueMap, val width: Int, val height: Int) { private class DynProvider(val cwf: CustomWatchface, val dataJson: JSONObject, val valueMap: ValueMap, val width: Int, val height: Int) {
private val dynDrawable = mutableMapOf<Int, Drawable?>() private val dynDrawable = mutableMapOf<Int, Drawable?>()
private val dynColor = mutableMapOf<Int, Int>() private val dynColor = mutableMapOf<Int, Int>()
@ -698,6 +700,7 @@ class CustomWatchface : BaseWatchFace() {
ValueMap.RIG_BATTERY -> cwf.status.rigBattery.replace("%", "").toDoubleOrNull() ValueMap.RIG_BATTERY -> cwf.status.rigBattery.replace("%", "").toDoubleOrNull()
ValueMap.UPLOADER_BATTERY -> cwf.status.battery.replace("%", "").toDoubleOrNull() ValueMap.UPLOADER_BATTERY -> cwf.status.battery.replace("%", "").toDoubleOrNull()
ValueMap.LOOP -> if (cwf.status.openApsStatus != -1L) ((System.currentTimeMillis() - cwf.status.openApsStatus) / 1000 / 60).toDouble() else null ValueMap.LOOP -> if (cwf.status.openApsStatus != -1L) ((System.currentTimeMillis() - cwf.status.openApsStatus) / 1000 / 60).toDouble() else null
ValueMap.TIMESTAMP -> if (cwf.singleBg.timeStamp != 0L) floor(cwf.timeSince() / (1000 * 60)) else null
ValueMap.DAY -> DateTime().dayOfMonth.toDouble() ValueMap.DAY -> DateTime().dayOfMonth.toDouble()
ValueMap.DAY_NAME -> DateTime().dayOfWeek.toDouble() ValueMap.DAY_NAME -> DateTime().dayOfWeek.toDouble()
ValueMap.MONTH -> DateTime().monthOfYear.toDouble() ValueMap.MONTH -> DateTime().monthOfYear.toDouble()
@ -707,7 +710,7 @@ class CustomWatchface : BaseWatchFace() {
fun getTopOffset(): Int = dataRange?.let { dataRange -> topRange?.let { topRange -> dataValue?.let { valueMap.dynValue(it, dataRange, topRange) } ?: topRange.invalidData } } ?: 0 fun getTopOffset(): Int = dataRange?.let { dataRange -> topRange?.let { topRange -> dataValue?.let { valueMap.dynValue(it, dataRange, topRange) } ?: topRange.invalidData } } ?: 0
fun getLeftOffset(): Int = dataRange?.let { dataRange -> leftRange?.let { leftRange -> dataValue?.let { valueMap.dynValue(it, dataRange, leftRange) } ?: leftRange.invalidData } } ?: 0 fun getLeftOffset(): Int = dataRange?.let { dataRange -> leftRange?.let { leftRange -> dataValue?.let { valueMap.dynValue(it, dataRange, leftRange) } ?: leftRange.invalidData } } ?: 0
fun getRotationOffset(): Int = dataRange?.let { dataRange -> rotationRange?.let { rotRange -> dataValue?.let { valueMap.dynValue(it, dataRange, rotRange) } ?: rotRange.invalidData } } ?: 0 fun getRotationOffset(): Int = dataRange?.let { dataRange -> rotationRange?.let { rotRange -> dataValue?.let { valueMap.dynValue(it, dataRange, rotRange) } ?: rotRange.invalidData } } ?: 0
fun getDrawable() = dataRange?.let { dataRange -> dataValue?.let { dynDrawable[valueMap.stepValue(it, dataRange, stepDraw)] } ?:dynDrawable[0] } fun getDrawable() = dataRange?.let { dataRange -> dataValue?.let { dynDrawable[valueMap.stepValue(it, dataRange, stepDraw)] } ?: dynDrawable[0] }
fun getColor() = if (stepColor > 0) dataRange?.let { dataRange -> dataValue?.let { dynColor[valueMap.stepValue(it, dataRange, stepColor)] } ?: dynColor[0] } else null fun getColor() = if (stepColor > 0) dataRange?.let { dataRange -> dataValue?.let { dynColor[valueMap.stepValue(it, dataRange, stepColor)] } ?: dynColor[0] } else null
private fun load() { private fun load() {
dynDrawable[0] = dataJson.optString(INVALIDIMAGE.key)?.let { cwf.resDataMap[it]?.toDrawable(cwf.resources, width, height) } dynDrawable[0] = dataJson.optString(INVALIDIMAGE.key)?.let { cwf.resDataMap[it]?.toDrawable(cwf.resources, width, height) }
@ -733,20 +736,19 @@ class CustomWatchface : BaseWatchFace() {
companion object { companion object {
val dynData = mutableMapOf<String, DynProvider>() val dynData = mutableMapOf<String, DynProvider>()
private lateinit var cwf: CustomWatchface
var dynJson: JSONObject? = null var dynJson: JSONObject? = null
fun init(cwf: CustomWatchface, dynJson: JSONObject?) { fun init(dynJson: JSONObject?) {
this.cwf = cwf
this.dynJson = dynJson this.dynJson = dynJson
dynData.clear() dynData.clear()
} }
fun getDyn(key: String, width: Int, height: Int, defaultViewKey: String): DynProvider? = dynData["${defaultViewKey}_$key"] fun getDyn(cwf: CustomWatchface, key: String, width: Int, height: Int, defaultViewKey: String): DynProvider? = dynData["${defaultViewKey}_$key"]
?: dynJson?.optJSONObject(key)?.let { dataJson -> ?: dynJson?.optJSONObject(key)?.let { dataJson ->
ValueMap.fromKey(dataJson.optString(VALUEKEY.key, defaultViewKey))?.let { valueMap -> ValueMap.fromKey(dataJson.optString(VALUEKEY.key, defaultViewKey))?.let { valueMap ->
DynProvider(dataJson, valueMap, width, height).also { it.load() } DynProvider(cwf, dataJson, valueMap, width, height).also { it.load() }
} }
}?.also { dynData["${defaultViewKey}_$key"] = it } }?.also { dynData["${defaultViewKey}_$key"] = it }
private fun parseDataRange(json: JSONObject?, defaultData: DataRange) = private fun parseDataRange(json: JSONObject?, defaultData: DataRange) =
json?.let { json?.let {
DataRange( DataRange(