CustomWF add enum for font, style and gravity management
This commit is contained in:
parent
5bf787bdc0
commit
2c383bbee0
1 changed files with 69 additions and 76 deletions
|
@ -20,6 +20,7 @@ import android.widget.FrameLayout
|
||||||
import android.widget.ImageView
|
import android.widget.ImageView
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import androidx.annotation.DrawableRes
|
import androidx.annotation.DrawableRes
|
||||||
|
import androidx.annotation.FontRes
|
||||||
import androidx.annotation.IdRes
|
import androidx.annotation.IdRes
|
||||||
import androidx.annotation.StringRes
|
import androidx.annotation.StringRes
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
|
@ -57,6 +58,10 @@ class CustomWatchface : BaseWatchFace() {
|
||||||
private var lowBatColor = Color.RED
|
private var lowBatColor = Color.RED
|
||||||
private var bgColor = Color.WHITE
|
private var bgColor = Color.WHITE
|
||||||
|
|
||||||
|
override fun onCreate() {
|
||||||
|
super.onCreate()
|
||||||
|
FontMap.init(context)
|
||||||
|
}
|
||||||
|
|
||||||
@Suppress("DEPRECATION")
|
@Suppress("DEPRECATION")
|
||||||
override fun inflateLayout(inflater: LayoutInflater): ViewBinding {
|
override fun inflateLayout(inflater: LayoutInflater): ViewBinding {
|
||||||
|
@ -78,7 +83,7 @@ class CustomWatchface : BaseWatchFace() {
|
||||||
|
|
||||||
override fun setDataFields() {
|
override fun setDataFields() {
|
||||||
super.setDataFields()
|
super.setDataFields()
|
||||||
binding.direction2.setImageDrawable(resources.getDrawable(TrendArrow.fromSymbol(singleBg.slopeArrow).icon))
|
binding.direction2.setImageDrawable(resources.getDrawable(TrendArrow.icon(singleBg.slopeArrow)))
|
||||||
// rotate the second hand.
|
// rotate the second hand.
|
||||||
binding.secondHand.rotation = TimeOfDay().secondOfMinute * 6f
|
binding.secondHand.rotation = TimeOfDay().secondOfMinute * 6f
|
||||||
// rotate the minute hand.
|
// rotate the minute hand.
|
||||||
|
@ -86,6 +91,7 @@ class CustomWatchface : BaseWatchFace() {
|
||||||
// rotate the hour hand.
|
// rotate the hour hand.
|
||||||
binding.hourHand.rotation = TimeOfDay().hourOfDay * 30f + TimeOfDay().minuteOfHour * 0.5f
|
binding.hourHand.rotation = TimeOfDay().hourOfDay * 30f + TimeOfDay().minuteOfHour * 0.5f
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun setColorDark() {
|
override fun setColorDark() {
|
||||||
setWatchfaceStyle()
|
setWatchfaceStyle()
|
||||||
binding.sgv.setTextColor(bgColor)
|
binding.sgv.setTextColor(bgColor)
|
||||||
|
@ -164,10 +170,10 @@ class CustomWatchface : BaseWatchFace() {
|
||||||
if (view is TextView) {
|
if (view is TextView) {
|
||||||
view.rotation = if (viewjson.has("rotation")) viewjson.getInt("rotation").toFloat() else 0F
|
view.rotation = if (viewjson.has("rotation")) viewjson.getInt("rotation").toFloat() else 0F
|
||||||
view.setTextSize(TypedValue.COMPLEX_UNIT_PX, ((if (viewjson.has("textsize")) viewjson.getInt("textsize") else 22) * zoomFactor).toFloat())
|
view.setTextSize(TypedValue.COMPLEX_UNIT_PX, ((if (viewjson.has("textsize")) viewjson.getInt("textsize") else 22) * zoomFactor).toFloat())
|
||||||
view.gravity = setGravity(if (viewjson.has("gravity")) viewjson.getString("gravity") else "center")
|
view.gravity = GravityMap.gravity(if (viewjson.has("gravity")) viewjson.getString("gravity") else GravityMap.CENTER.key)
|
||||||
view.setTypeface(
|
view.setTypeface(
|
||||||
setFont(if (viewjson.has("font")) viewjson.getString("font") else "sans-serif"),
|
FontMap.font(if (viewjson.has("font")) viewjson.getString("font") else FontMap.DEFAULT.key),
|
||||||
setStyle(if (viewjson.has("fontStyle")) viewjson.getString("fontStyle") else "normal")
|
StyleMap.style(if (viewjson.has("fontStyle")) viewjson.getString("fontStyle") else StyleMap.NORMAL.key)
|
||||||
)
|
)
|
||||||
if (viewjson.has("fontColor"))
|
if (viewjson.has("fontColor"))
|
||||||
view.setTextColor(getColor(viewjson.getString("fontColor")))
|
view.setTextColor(getColor(viewjson.getString("fontColor")))
|
||||||
|
@ -202,7 +208,7 @@ class CustomWatchface : BaseWatchFace() {
|
||||||
}
|
}
|
||||||
binding.background.visibility = View.VISIBLE
|
binding.background.visibility = View.VISIBLE
|
||||||
updateSecondVisibility()
|
updateSecondVisibility()
|
||||||
} catch (e:Exception) {
|
} catch (e: Exception) {
|
||||||
aapsLogger.debug(LTag.WEAR, "Crash during Custom watch load")
|
aapsLogger.debug(LTag.WEAR, "Crash during Custom watch load")
|
||||||
persistence.store(defaultWatchface(), false) // relaod correct values to avoid crash of watchface
|
persistence.store(defaultWatchface(), false) // relaod correct values to avoid crash of watchface
|
||||||
}
|
}
|
||||||
|
@ -217,7 +223,7 @@ class CustomWatchface : BaseWatchFace() {
|
||||||
.put(CustomWatchfaceMetadataKey.CWF_CREATED_AT.key, dateUtil.dateString(dateUtil.now()))
|
.put(CustomWatchfaceMetadataKey.CWF_CREATED_AT.key, dateUtil.dateString(dateUtil.now()))
|
||||||
.put(CustomWatchfaceMetadataKey.CWF_AUTHOR_VERSION.key, CUSTOM_VERSION)
|
.put(CustomWatchfaceMetadataKey.CWF_AUTHOR_VERSION.key, CUSTOM_VERSION)
|
||||||
.put(CustomWatchfaceMetadataKey.CWF_VERSION.key, CUSTOM_VERSION)
|
.put(CustomWatchfaceMetadataKey.CWF_VERSION.key, CUSTOM_VERSION)
|
||||||
.put(CustomWatchfaceMetadataKey.CWF_COMMENT.key,getString(info.nightscout.shared.R.string.default_custom_watchface_comment))
|
.put(CustomWatchfaceMetadataKey.CWF_COMMENT.key, getString(info.nightscout.shared.R.string.default_custom_watchface_comment))
|
||||||
val json = JSONObject()
|
val json = JSONObject()
|
||||||
.put("metadata", metadata)
|
.put("metadata", metadata)
|
||||||
.put("highColor", String.format("#%06X", 0xFFFFFF and highColor))
|
.put("highColor", String.format("#%06X", 0xFFFFFF and highColor))
|
||||||
|
@ -228,7 +234,7 @@ class CustomWatchface : BaseWatchFace() {
|
||||||
.put("basalBackgroundColor", String.format("#%06X", 0xFFFFFF and basalBackgroundColor))
|
.put("basalBackgroundColor", String.format("#%06X", 0xFFFFFF and basalBackgroundColor))
|
||||||
.put("basalCenterColor", String.format("#%06X", 0xFFFFFF and basalCenterColor))
|
.put("basalCenterColor", String.format("#%06X", 0xFFFFFF and basalCenterColor))
|
||||||
.put("gridColor", String.format("#%06X", 0xFFFFFF and Color.WHITE))
|
.put("gridColor", String.format("#%06X", 0xFFFFFF and Color.WHITE))
|
||||||
.put("pointSize",2)
|
.put("pointSize", 2)
|
||||||
.put("enableSecond", true)
|
.put("enableSecond", true)
|
||||||
|
|
||||||
binding.mainLayout.forEach { view ->
|
binding.mainLayout.forEach { view ->
|
||||||
|
@ -245,9 +251,9 @@ class CustomWatchface : BaseWatchFace() {
|
||||||
.put("rotation", view.rotation.toInt())
|
.put("rotation", view.rotation.toInt())
|
||||||
.put("visibility", getVisibility(view.visibility))
|
.put("visibility", getVisibility(view.visibility))
|
||||||
.put("textsize", view.textSize.toInt())
|
.put("textsize", view.textSize.toInt())
|
||||||
.put("gravity", getGravity(view.gravity))
|
.put("gravity", GravityMap.key(view.gravity))
|
||||||
.put("font", getFont(view.typeface))
|
.put("font", FontMap.key())
|
||||||
.put("fontStyle", getStyle(view.typeface.style))
|
.put("fontStyle", StyleMap.key(view.typeface.style))
|
||||||
.put("fontColor", String.format("#%06X", 0xFFFFFF and view.currentTextColor))
|
.put("fontColor", String.format("#%06X", 0xFFFFFF and view.currentTextColor))
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -260,7 +266,7 @@ class CustomWatchface : BaseWatchFace() {
|
||||||
.put("topmargin", (params.topMargin / zoomFactor).toInt())
|
.put("topmargin", (params.topMargin / zoomFactor).toInt())
|
||||||
.put("leftmargin", (params.leftMargin / zoomFactor).toInt())
|
.put("leftmargin", (params.leftMargin / zoomFactor).toInt())
|
||||||
.put("visibility", getVisibility(view.visibility))
|
.put("visibility", getVisibility(view.visibility))
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
if (view is lecho.lib.hellocharts.view.LineChartView) {
|
if (view is lecho.lib.hellocharts.view.LineChartView) {
|
||||||
json.put(
|
json.put(
|
||||||
|
@ -278,7 +284,7 @@ class CustomWatchface : BaseWatchFace() {
|
||||||
val metadataMap = ZipWatchfaceFormat.loadMetadata(json)
|
val metadataMap = ZipWatchfaceFormat.loadMetadata(json)
|
||||||
val drawableDataMap: CustomWatchfaceDrawableDataMap = mutableMapOf()
|
val drawableDataMap: CustomWatchfaceDrawableDataMap = mutableMapOf()
|
||||||
getResourceByteArray(info.nightscout.shared.R.drawable.watchface_custom)?.let {
|
getResourceByteArray(info.nightscout.shared.R.drawable.watchface_custom)?.let {
|
||||||
val drawableData = DrawableData(it,DrawableFormat.PNG)
|
val drawableData = DrawableData(it, DrawableFormat.PNG)
|
||||||
drawableDataMap[CustomWatchfaceDrawableDataKey.CUSTOM_WATCHFACE] = drawableData
|
drawableDataMap[CustomWatchfaceDrawableDataKey.CUSTOM_WATCHFACE] = drawableData
|
||||||
}
|
}
|
||||||
return EventData.ActionSetCustomWatchface(CustomWatchfaceData(json.toString(4), metadataMap, drawableDataMap))
|
return EventData.ActionSetCustomWatchface(CustomWatchfaceData(json.toString(4), metadataMap, drawableDataMap))
|
||||||
|
@ -309,62 +315,6 @@ class CustomWatchface : BaseWatchFace() {
|
||||||
else -> "gone"
|
else -> "gone"
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setGravity(gravity: String): Int = when (gravity) {
|
|
||||||
"center" -> Gravity.CENTER
|
|
||||||
"left" -> Gravity.LEFT
|
|
||||||
"right" -> Gravity.RIGHT
|
|
||||||
else -> Gravity.CENTER
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getGravity(gravity: Int): String = when (gravity) {
|
|
||||||
Gravity.CENTER -> "center"
|
|
||||||
Gravity.LEFT -> "left"
|
|
||||||
Gravity.RIGHT -> "right"
|
|
||||||
else -> "center"
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun setFont(font: String): Typeface = when (font) {
|
|
||||||
"sans-serif" -> Typeface.SANS_SERIF
|
|
||||||
"default" -> Typeface.DEFAULT
|
|
||||||
"default-bold" -> Typeface.DEFAULT_BOLD
|
|
||||||
"monospace" -> Typeface.MONOSPACE
|
|
||||||
"serif" -> Typeface.SERIF
|
|
||||||
"roboto-condensed-bold" -> ResourcesCompat.getFont(context, R.font.roboto_condensed_bold)!!
|
|
||||||
"roboto-condensed-light" -> ResourcesCompat.getFont(context, R.font.roboto_condensed_light)!!
|
|
||||||
"roboto-condensed-regular" -> ResourcesCompat.getFont(context, R.font.roboto_condensed_regular)!!
|
|
||||||
"roboto-slab-light" -> ResourcesCompat.getFont(context, R.font.roboto_slab_light)!!
|
|
||||||
else -> Typeface.DEFAULT
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getFont(font: Typeface): String = when (font) {
|
|
||||||
Typeface.SANS_SERIF -> "sans-serif"
|
|
||||||
Typeface.DEFAULT -> "default"
|
|
||||||
Typeface.DEFAULT_BOLD -> "default-bold"
|
|
||||||
Typeface.MONOSPACE -> "monospace"
|
|
||||||
Typeface.SERIF -> "serif"
|
|
||||||
ResourcesCompat.getFont(context, R.font.roboto_condensed_bold)!! -> "roboto-condensed-bold"
|
|
||||||
ResourcesCompat.getFont(context, R.font.roboto_condensed_light)!! -> "roboto-condensed-light"
|
|
||||||
ResourcesCompat.getFont(context, R.font.roboto_condensed_regular)!! -> "roboto-condensed-regular"
|
|
||||||
ResourcesCompat.getFont(context, R.font.roboto_slab_light)!! -> "roboto-slab-light"
|
|
||||||
else -> "default"
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun setStyle(style: String): Int = when (style) {
|
|
||||||
"normal" -> Typeface.NORMAL
|
|
||||||
"bold" -> Typeface.BOLD
|
|
||||||
"bold-italic" -> Typeface.BOLD_ITALIC
|
|
||||||
"italic" -> Typeface.ITALIC
|
|
||||||
else -> Typeface.NORMAL
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getStyle(style: Int): String = when (style) {
|
|
||||||
Typeface.NORMAL -> "normal"
|
|
||||||
Typeface.BOLD -> "bold"
|
|
||||||
Typeface.BOLD_ITALIC -> "bold-italic"
|
|
||||||
Typeface.ITALIC -> "italic"
|
|
||||||
else -> "normal"
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getResourceByteArray(resourceId: Int): ByteArray? {
|
fun getResourceByteArray(resourceId: Int): ByteArray? {
|
||||||
val inputStream = resources.openRawResource(resourceId)
|
val inputStream = resources.openRawResource(resourceId)
|
||||||
val byteArrayOutputStream = ByteArrayOutputStream()
|
val byteArrayOutputStream = ByteArrayOutputStream()
|
||||||
|
@ -412,7 +362,7 @@ class CustomWatchface : BaseWatchFace() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum class CustomViews(val key: String, @IdRes val id: Int, @StringRes val pref: Int?) {
|
private enum class CustomViews(val key: String, @IdRes val id: Int, @StringRes val pref: Int?) {
|
||||||
|
|
||||||
BACKGROUND(CustomWatchfaceDrawableDataKey.BACKGROUND.key, R.id.background, null),
|
BACKGROUND(CustomWatchfaceDrawableDataKey.BACKGROUND.key, R.id.background, null),
|
||||||
CHART("chart", R.id.chart, null),
|
CHART("chart", R.id.chart, null),
|
||||||
|
@ -447,32 +397,75 @@ class CustomWatchface : BaseWatchFace() {
|
||||||
SECOND_HAND(CustomWatchfaceDrawableDataKey.SECONDHAND.key, R.id.second_hand, R.string.key_show_seconds);
|
SECOND_HAND(CustomWatchfaceDrawableDataKey.SECONDHAND.key, R.id.second_hand, R.string.key_show_seconds);
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
||||||
fun fromKey(key: String): CustomViews? = values().firstOrNull { it.key == key }
|
fun fromKey(key: String): CustomViews? = values().firstOrNull { it.key == key }
|
||||||
fun fromId(id: Int): CustomViews? = values().firstOrNull { it.id == id }
|
fun fromId(id: Int): CustomViews? = values().firstOrNull { it.id == id }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fun visibility(sp: SP): Boolean = this.pref?.let { sp.getBoolean(it, true) }
|
fun visibility(sp: SP): Boolean = this.pref?.let { sp.getBoolean(it, true) }
|
||||||
?: true
|
?: true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private enum class TrendArrow(val text: String, val symbol: String, @DrawableRes val icon: Int) {
|
||||||
enum class TrendArrow(val text: String, val symbol: String,@DrawableRes val icon: Int) {
|
|
||||||
NONE("NONE", "??", R.drawable.ic_invalid),
|
NONE("NONE", "??", R.drawable.ic_invalid),
|
||||||
TRIPLE_UP("TripleUp", "X", R.drawable.ic_doubleup),
|
TRIPLE_UP("TripleUp", "X", R.drawable.ic_doubleup),
|
||||||
DOUBLE_UP("DoubleUp", "\u21c8", R.drawable.ic_doubleup),
|
DOUBLE_UP("DoubleUp", "\u21c8", R.drawable.ic_doubleup),
|
||||||
SINGLE_UP("SingleUp", "\u2191", R.drawable.ic_singleup),
|
SINGLE_UP("SingleUp", "\u2191", R.drawable.ic_singleup),
|
||||||
FORTY_FIVE_UP("FortyFiveUp", "\u2197", R.drawable.ic_fortyfiveup),
|
FORTY_FIVE_UP("FortyFiveUp", "\u2197", R.drawable.ic_fortyfiveup),
|
||||||
FLAT("Flat", "\u2192", R.drawable.ic_flat),
|
FLAT("Flat", "\u2192", R.drawable.ic_flat),
|
||||||
FORTY_FIVE_DOWN("FortyFiveDown", "\u2198",R.drawable.ic_fortyfivedown),
|
FORTY_FIVE_DOWN("FortyFiveDown", "\u2198", R.drawable.ic_fortyfivedown),
|
||||||
SINGLE_DOWN("SingleDown", "\u2193", R.drawable.ic_singledown),
|
SINGLE_DOWN("SingleDown", "\u2193", R.drawable.ic_singledown),
|
||||||
DOUBLE_DOWN("DoubleDown", "\u21ca", R.drawable.ic_doubledown),
|
DOUBLE_DOWN("DoubleDown", "\u21ca", R.drawable.ic_doubledown),
|
||||||
TRIPLE_DOWN("TripleDown", "X",R.drawable.ic_doubledown)
|
TRIPLE_DOWN("TripleDown", "X", R.drawable.ic_doubledown)
|
||||||
;
|
;
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
fun fromSymbol(direction: String?) =
|
|
||||||
values().firstOrNull { it.symbol == direction } ?: NONE
|
fun icon(direction: String?) = values().firstOrNull { it.symbol == direction }?.icon ?: NONE.icon
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private enum class GravityMap(val key: String, val gravity: Int) {
|
||||||
|
CENTER("center", Gravity.CENTER),
|
||||||
|
LEFT("left", Gravity.LEFT),
|
||||||
|
RIGHT("right", Gravity.RIGHT);
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
|
||||||
|
fun gravity(key: String?) = values().firstOrNull { it.key == key }?.gravity ?: CENTER.gravity
|
||||||
|
fun key(gravity: Int) = values().firstOrNull { it.gravity == gravity }?.key ?: CENTER.key
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private enum class FontMap(val key: String, var font: Typeface, @FontRes val fontRessources: Int?) {
|
||||||
|
SANS_SERIF("sans-serif", Typeface.SANS_SERIF, null),
|
||||||
|
DEFAULT("default", Typeface.DEFAULT, null),
|
||||||
|
DEFAULT_BOLD("default-bold", Typeface.DEFAULT_BOLD, null),
|
||||||
|
MONOSPACE("monospace", Typeface.MONOSPACE, null),
|
||||||
|
SERIF("serif", Typeface.SERIF, null),
|
||||||
|
ROBOTO_CONDENSED_BOLD("roboto-condensed-bold", Typeface.DEFAULT, R.font.roboto_condensed_bold),
|
||||||
|
ROBOTO_CONDENSED_LIGHT("roboto-condensed-light", Typeface.DEFAULT, R.font.roboto_condensed_light),
|
||||||
|
ROBOTO_CONDENSED_REGULAR("roboto-condensed-regular", Typeface.DEFAULT, R.font.roboto_condensed_regular),
|
||||||
|
ROBOTO_SLAB_LIGHT("roboto-slab-light", Typeface.DEFAULT, R.font.roboto_slab_light);
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
|
||||||
|
fun init(context: Context) = values().forEach { it.font = it.fontRessources?.let { font -> ResourcesCompat.getFont(context, font) } ?: it.font }
|
||||||
|
fun font(key: String) = values().firstOrNull { it.key == key }?.font ?: DEFAULT.font
|
||||||
|
fun key() = DEFAULT.key
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private enum class StyleMap(val key: String, val style: Int) {
|
||||||
|
NORMAL("normal", Typeface.NORMAL),
|
||||||
|
BOLD("bold", Typeface.BOLD),
|
||||||
|
BOLD_ITALIC("bold-italic", Typeface.BOLD_ITALIC),
|
||||||
|
ITALIC("italic", Typeface.ITALIC);
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
|
||||||
|
fun style(key: String?) = values().firstOrNull { it.key == key }?.style ?: NORMAL.style
|
||||||
|
fun key(style: Int) = values().firstOrNull { it.style == style }?.key ?: NORMAL.key
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue