From dea7e3896c28140961bbc0020f3e608087707b4e Mon Sep 17 00:00:00 2001 From: Philoul Date: Tue, 17 Oct 2023 13:17:55 +0200 Subject: [PATCH 1/6] Wear CWF Text size can be tuned according to some settings --- .../rx/weardata/CustomWatchfaceFormat.kt | 1 + .../app/aaps/wear/watchfaces/CustomWatchface.kt | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/rx/weardata/CustomWatchfaceFormat.kt b/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/rx/weardata/CustomWatchfaceFormat.kt index f376d23d68..1343206001 100644 --- a/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/rx/weardata/CustomWatchfaceFormat.kt +++ b/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/rx/weardata/CustomWatchfaceFormat.kt @@ -260,6 +260,7 @@ enum class JsonKeys(val key: String) { INVALIDIMAGE("invalidImage"), INVALIDCOLOR("invalidColor"), INVALIDFONTCOLOR("invalidFontColor"), + INVALIDTEXTSIZE("invalidTextSize"), TWINVIEW("twinView"), TOPOFFSETTWINHIDDEN("topOffsetTwinHidden"), LEFTOFFSETTWINHIDDEN("leftOffsetTwinHidden"), diff --git a/wear/src/main/kotlin/app/aaps/wear/watchfaces/CustomWatchface.kt b/wear/src/main/kotlin/app/aaps/wear/watchfaces/CustomWatchface.kt index a31d06d163..afdeb4f33e 100644 --- a/wear/src/main/kotlin/app/aaps/wear/watchfaces/CustomWatchface.kt +++ b/wear/src/main/kotlin/app/aaps/wear/watchfaces/CustomWatchface.kt @@ -507,7 +507,7 @@ class CustomWatchface : BaseWatchFace() { fun customizeTextView(view: TextView) { customizeViewCommon(view) viewJson?.let { viewJson -> - view.setTextSize(TypedValue.COMPLEX_UNIT_PX, (viewJson.optInt(TEXTSIZE.key, 22) * cwf.zoomFactor).toFloat()) + view.setTextSize(TypedValue.COMPLEX_UNIT_PX, ((dynData?.getTextSize() ?: viewJson.optInt(TEXTSIZE.key, 22)) * cwf.zoomFactor).toFloat()) view.gravity = GravityMap.gravity(viewJson.optString(GRAVITY.key, GravityMap.CENTER.key)) view.setTypeface( FontMap.font(viewJson.optString(FONT.key, FontMap.DEFAULT.key)), @@ -727,6 +727,7 @@ class CustomWatchface : BaseWatchFace() { private val dynDrawable = mutableMapOf() private val dynColor = mutableMapOf() private val dynFontColor = mutableMapOf() + private val dynTextSize = mutableMapOf() private var dataRange: DataRange? = null private var topRange: DataRange? = null private var leftRange: DataRange? = null @@ -737,6 +738,8 @@ class CustomWatchface : BaseWatchFace() { get() = dynColor[0]?.let { dynColor.size - 1 } ?: dynColor.size val stepFontColor: Int get() = dynFontColor[0]?.let { dynFontColor.size - 1 } ?: dynFontColor.size + val stepTextSize: Int + get() = dynTextSize[0]?.let { dynTextSize.size - 1 } ?: dynTextSize.size val dataValue: Double? get() = when (valueMap) { @@ -763,6 +766,7 @@ class CustomWatchface : BaseWatchFace() { 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] ?: dynDrawable[1] } fun getFontColor() = if (stepFontColor > 0) dataRange?.let { dataRange -> dataValue?.let { dynFontColor[valueMap.stepValue(it, dataRange, stepFontColor)] } ?: dynFontColor[0] ?: dynFontColor[1] } else null + fun getTextSize() = if (stepTextSize > 0) dataRange?.let { dataRange -> dataValue?.let { dynTextSize[valueMap.stepValue(it, dataRange, stepTextSize)] } ?: dynTextSize[0] ?: dynTextSize[1] } else null fun getColor() = if (stepColor > 0) dataRange?.let { dataRange -> dataValue?.let { dynColor[valueMap.stepValue(it, dataRange, stepColor)] } ?: dynColor[0] ?: dynColor[1] } else null private fun load() { DataRange(dataJson.optDouble(MINDATA.key, valueMap.min), dataJson.optDouble(MAXDATA.key, valueMap.max)).let { defaultRange -> @@ -792,6 +796,13 @@ class CustomWatchface : BaseWatchFace() { dynFontColor[idx] = cwf.getColor(dataJson.optString("${FONTCOLOR.key}$idx")) idx++ } + if (dataJson.has(INVALIDTEXTSIZE.key)) + dynTextSize[0] = cwf.getColor(dataJson.optString(INVALIDTEXTSIZE.key)) + idx = 1 + while (dataJson.has("${TEXTSIZE.key}$idx")) { + dynTextSize[idx] = dataJson.optInt("${TEXTSIZE.key}$idx", 22) + idx++ + } } companion object { @@ -866,7 +877,7 @@ class CustomWatchface : BaseWatchFace() { } } } else { - //aapsLogger.debug("XXXXX dynKey json $key $nextJson") + aapsLogger.debug("XXXXX dynKey json $key $nextJson") dynPref[key] = nextJson } } From c0c651b5cb1f01992a201b511dd20a5b55e67e98 Mon Sep 17 00:00:00 2001 From: Philoul Date: Tue, 17 Oct 2023 18:16:11 +0200 Subject: [PATCH 2/6] Wear CWF Static Color, FontColor, Image of TextSize can be linked to different settings --- .../aaps/wear/watchfaces/CustomWatchface.kt | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/wear/src/main/kotlin/app/aaps/wear/watchfaces/CustomWatchface.kt b/wear/src/main/kotlin/app/aaps/wear/watchfaces/CustomWatchface.kt index afdeb4f33e..bb3460e148 100644 --- a/wear/src/main/kotlin/app/aaps/wear/watchfaces/CustomWatchface.kt +++ b/wear/src/main/kotlin/app/aaps/wear/watchfaces/CustomWatchface.kt @@ -733,7 +733,7 @@ class CustomWatchface : BaseWatchFace() { private var leftRange: DataRange? = null private var rotationRange: DataRange? = null val stepDraw: Int - get() = dynDrawable[0]?.let { dynDrawable.size - 1 } ?: dynDrawable.size + get() = dynDrawable.size - 1 val stepColor: Int get() = dynColor[0]?.let { dynColor.size - 1 } ?: dynColor.size val stepFontColor: Int @@ -764,7 +764,7 @@ class CustomWatchface : BaseWatchFace() { fun getLeftOffset(): Int = dataRange?.let { dataRange -> leftRange?.let { leftRange -> dataValue?.let { (valueMap.dynValue(it, dataRange, leftRange) * cwf.zoomFactor).toInt() } ?: (leftRange.invalidData * cwf.zoomFactor).toInt() } } ?: 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] ?: dynDrawable[1] } + fun getDrawable() = dataRange?.let { dataRange -> dataValue?.let { dynDrawable[valueMap.stepValue(it, dataRange, stepDraw)] } ?: dynDrawable[0] } fun getFontColor() = if (stepFontColor > 0) dataRange?.let { dataRange -> dataValue?.let { dynFontColor[valueMap.stepValue(it, dataRange, stepFontColor)] } ?: dynFontColor[0] ?: dynFontColor[1] } else null fun getTextSize() = if (stepTextSize > 0) dataRange?.let { dataRange -> dataValue?.let { dynTextSize[valueMap.stepValue(it, dataRange, stepTextSize)] } ?: dynTextSize[0] ?: dynTextSize[1] } else null fun getColor() = if (stepColor > 0) dataRange?.let { dataRange -> dataValue?.let { dynColor[valueMap.stepValue(it, dataRange, stepColor)] } ?: dynColor[0] ?: dynColor[1] } else null @@ -856,11 +856,12 @@ class CustomWatchface : BaseWatchFace() { valPref.clear() dynPref.clear() dynJson?.keys()?.forEach { key -> - dynJson.optJSONObject(key)?.let { buildDynPrefs(dynJson, it, key, mutableSetOf()) } + val targetJson = JSONObject() + dynJson.optJSONObject(key)?.let { buildDynPrefs(dynJson, targetJson, it, key, mutableSetOf()) } } } - private fun buildDynPrefs(dynJson: JSONObject, json: JSONObject, key: String, visitedKeys: MutableSet) { + private fun buildDynPrefs(dynJson: JSONObject, targetJson: JSONObject, json: JSONObject, key: String, visitedKeys: MutableSet) { val prefKey = json.optString(PREFKEY.key) PrefMap.fromKey(prefKey)?.let { prefMap -> val value = valPref[prefMap.key] @@ -869,16 +870,24 @@ class CustomWatchface : BaseWatchFace() { } json.optJSONObject(value)?.let { nextJson -> if (nextJson.has(DYNPREF.key)) { + nextJson.keys().forEach { key -> + if ( key != DYNPREF.key) + targetJson.putOpt(key, nextJson.opt(key)) + } val nextKey = nextJson.optString(DYNPREF.key) if (nextKey.isNotEmpty() && nextKey !in visitedKeys) { visitedKeys += nextKey dynJson.optJSONObject(nextKey)?.let { - buildDynPrefs(dynJson, it, key, visitedKeys) + buildDynPrefs(dynJson, targetJson, it, key, visitedKeys) } } } else { - aapsLogger.debug("XXXXX dynKey json $key $nextJson") - dynPref[key] = nextJson + nextJson.keys().forEach { key -> + if ( key != DYNPREF.key) + targetJson.putOpt(key, nextJson.opt(key)) + } + aapsLogger.debug("XXXXX dynPref key json $key $targetJson") + dynPref[key] = targetJson } } } From cddeef84ba9f8da2771882596ead254d3855badc Mon Sep 17 00:00:00 2001 From: Philoul Date: Tue, 17 Oct 2023 18:18:03 +0200 Subject: [PATCH 3/6] Wear CWF Clean code --- wear/src/main/kotlin/app/aaps/wear/watchfaces/CustomWatchface.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/wear/src/main/kotlin/app/aaps/wear/watchfaces/CustomWatchface.kt b/wear/src/main/kotlin/app/aaps/wear/watchfaces/CustomWatchface.kt index bb3460e148..3a7a602544 100644 --- a/wear/src/main/kotlin/app/aaps/wear/watchfaces/CustomWatchface.kt +++ b/wear/src/main/kotlin/app/aaps/wear/watchfaces/CustomWatchface.kt @@ -886,7 +886,6 @@ class CustomWatchface : BaseWatchFace() { if ( key != DYNPREF.key) targetJson.putOpt(key, nextJson.opt(key)) } - aapsLogger.debug("XXXXX dynPref key json $key $targetJson") dynPref[key] = targetJson } } From 822a32f529126d6a18e84de1d35b5bd1a16a8fff Mon Sep 17 00:00:00 2001 From: Philoul Date: Tue, 17 Oct 2023 22:30:25 +0200 Subject: [PATCH 4/6] Wear CWF Add ShowDate preferences to CWF for AAPS v2 compatibility --- .../rx/weardata/CustomWatchfaceFormat.kt | 3 ++- core/interfaces/src/main/res/values/strings.xml | 1 + .../app/aaps/wear/watchfaces/CustomWatchface.kt | 17 +++++++++-------- .../res/xml/watch_face_configuration_custom.xml | 7 +++++++ 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/rx/weardata/CustomWatchfaceFormat.kt b/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/rx/weardata/CustomWatchfaceFormat.kt index 1343206001..0cae6aa73d 100644 --- a/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/rx/weardata/CustomWatchfaceFormat.kt +++ b/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/rx/weardata/CustomWatchfaceFormat.kt @@ -170,7 +170,8 @@ enum class CwfMetadataKey(val key: String, @StringRes val label: Int, val isPref CWF_PREF_WATCH_SHOW_AGO("key_show_ago", R.string.pref_show_ago, true), CWF_PREF_WATCH_SHOW_BG("key_show_bg", R.string.pref_show_bg, true), CWF_PREF_WATCH_SHOW_LOOP_STATUS("key_show_loop_status", R.string.pref_show_loop_status, true), - CWF_PREF_WATCH_SHOW_WEEK_NUMBER("key_show_week_number", R.string.pref_show_week_number, true); + CWF_PREF_WATCH_SHOW_WEEK_NUMBER("key_show_week_number", R.string.pref_show_week_number, true), + CWF_PREF_WATCH_SHOW_DATE("key_show_date", R.string.pref_show_date, true); companion object { diff --git a/core/interfaces/src/main/res/values/strings.xml b/core/interfaces/src/main/res/values/strings.xml index 25af997279..343e299d31 100644 --- a/core/interfaces/src/main/res/values/strings.xml +++ b/core/interfaces/src/main/res/values/strings.xml @@ -66,6 +66,7 @@ Show Direction Arrow Show Ago Show Week number + Show Date Default watchface, you can click on EXPORT WATCHFACE button to generate a template Default Watchface Background image diff --git a/wear/src/main/kotlin/app/aaps/wear/watchfaces/CustomWatchface.kt b/wear/src/main/kotlin/app/aaps/wear/watchfaces/CustomWatchface.kt index 3a7a602544..62fa6701f0 100644 --- a/wear/src/main/kotlin/app/aaps/wear/watchfaces/CustomWatchface.kt +++ b/wear/src/main/kotlin/app/aaps/wear/watchfaces/CustomWatchface.kt @@ -106,15 +106,15 @@ class CustomWatchface : BaseWatchFace() { override fun setColorDark() { setWatchfaceStyle() - if ((ViewMap.SGV.dynData?.stepFontColor ?: 0) == 0) + if ((ViewMap.SGV.dynData?.stepFontColor ?: 0) <= 0) binding.sgv.setTextColor(bgColor) - if ((ViewMap.DIRECTION.dynData?.stepColor ?: 0) == 0) + if ((ViewMap.DIRECTION.dynData?.stepColor ?: 0) <= 0) binding.direction2.colorFilter = changeDrawableColor(bgColor) - if (ageLevel != 1 && (ViewMap.TIMESTAMP.dynData?.stepFontColor ?: 0) == 0) + if (ageLevel != 1 && (ViewMap.TIMESTAMP.dynData?.stepFontColor ?: 0) <= 0) binding.timestamp.setTextColor(ContextCompat.getColor(this, R.color.dark_TimestampOld)) - if (status.batteryLevel != 1 && (ViewMap.UPLOADER_BATTERY.dynData?.stepFontColor ?: 0) == 0) + if (status.batteryLevel != 1 && (ViewMap.UPLOADER_BATTERY.dynData?.stepFontColor ?: 0) <= 0) binding.uploaderBattery.setTextColor(lowBatColor) - if ((ViewMap.LOOP.dynData?.stepDraw ?: 0) == 0) // Apply automatic background image only if no dynData or no step images + if ((ViewMap.LOOP.dynData?.stepDraw ?: 0) <= 0) // Apply automatic background image only if no dynData or no step images when (loopLevel) { -1 -> binding.loop.setBackgroundResource(R.drawable.loop_grey_25) 1 -> binding.loop.setBackgroundResource(R.drawable.loop_green_25) @@ -393,10 +393,10 @@ class CustomWatchface : BaseWatchFace() { MINUTE(ViewKeys.MINUTE.key, R.id.minute), SECOND(ViewKeys.SECOND.key, R.id.second, R.string.key_show_seconds), TIMEPERIOD(ViewKeys.TIMEPERIOD.key, R.id.timePeriod), - DAY_NAME(ViewKeys.DAY_NAME.key, R.id.day_name), - DAY(ViewKeys.DAY.key, R.id.day), + DAY_NAME(ViewKeys.DAY_NAME.key, R.id.day_name, R.string.key_show_date), + DAY(ViewKeys.DAY.key, R.id.day, R.string.key_show_date), WEEKNUMBER(ViewKeys.WEEKNUMBER.key, R.id.week_number, R.string.key_show_week_number), - MONTH(ViewKeys.MONTH.key, R.id.month), + MONTH(ViewKeys.MONTH.key, R.id.month, R.string.key_show_date), LOOP(ViewKeys.LOOP.key, R.id.loop, R.string.key_show_external_status), DIRECTION(ViewKeys.DIRECTION.key, R.id.direction2, R.string.key_show_direction), TIMESTAMP(ViewKeys.TIMESTAMP.key, R.id.timestamp, R.string.key_show_ago), @@ -673,6 +673,7 @@ class CustomWatchface : BaseWatchFace() { SHOW_BGI(CwfMetadataKey.CWF_PREF_WATCH_SHOW_BGI.key, R.string.key_show_bgi, true), SHOW_LOOP_STATUS(CwfMetadataKey.CWF_PREF_WATCH_SHOW_LOOP_STATUS.key, R.string.key_show_external_status, true), SHOW_WEEK_NUMBER(CwfMetadataKey.CWF_PREF_WATCH_SHOW_WEEK_NUMBER.key, R.string.key_show_week_number, true), + SHOW_DATE(CwfMetadataKey.CWF_PREF_WATCH_SHOW_DATE.key, R.string.key_show_date, true), PREF_UNITS(JsonKeyValues.PREF_UNITS.key, R.string.key_units_mgdl, true), PREF_DARK(JsonKeyValues.PREF_DARK.key, R.string.key_dark, true), PREF_MATCH_DIVIDER(JsonKeyValues.PREF_MATCH_DIVIDER.key, R.string.key_match_divider, true); diff --git a/wear/src/main/res/xml/watch_face_configuration_custom.xml b/wear/src/main/res/xml/watch_face_configuration_custom.xml index 9cafa3ad48..e6e2f3408d 100644 --- a/wear/src/main/res/xml/watch_face_configuration_custom.xml +++ b/wear/src/main/res/xml/watch_face_configuration_custom.xml @@ -31,6 +31,13 @@ app:wear_iconOff="@drawable/settings_off" app:wear_iconOn="@drawable/settings_on" /> + + Date: Wed, 18 Oct 2023 21:50:03 +0200 Subject: [PATCH 5/6] Wear CWF Add AAPS V2 to assets --- .../configuration/src/main/assets/AAPS V2.zip | Bin 0 -> 31247 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 plugins/configuration/src/main/assets/AAPS V2.zip diff --git a/plugins/configuration/src/main/assets/AAPS V2.zip b/plugins/configuration/src/main/assets/AAPS V2.zip new file mode 100644 index 0000000000000000000000000000000000000000..77de36f142e736cbb778e05e34b3a7a841c9a1d8 GIT binary patch literal 31247 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%0DW*N1SHG-M!}h02U( zS`Fd#mAF!t_6hq3Bbx0$%H9d;yI-2vZc$g#pD12i+8^#j7oK_m5$?V?cWp#<&p*j3 zF`%=j+pjcxM508Q-!X}Woy?M+ocIFPQ41c;xs1`jebw?E^9`YQ=|fzmsf@8NFmQz3Ss; zPJTQ6yVon3^e+nn*(WF`0wp2shn^~(#w12~_=kKv1Vo6~mwFORIG`D}o?bqiJ~V8v zWjKup@uq2@mx)qgL-2UUMZK0_-Q7Q(0$E)}O|HttV^O2Z4bsJ7ZBj{vql%3jAEjNk zu2dF}t(fs717?dZ^RN@SscY}pqh`gz%EHI?pSB5??uDl<7ha-XA?&F^*G=C`P&I6c zDVNOddzSpl8!)6e;vJ+g-2UTAO#4w#?Q=&Dj_nZ@GxP1pIhI_H71o-^o4SRXs@j4} z?F(N{lS*|}6Cy#6Y~n7X5@s^TV}+BAcmwXH5U8=qb%*~g?) zglYdWmL(gmKBUj}!9lUWRCioNYa;3a7>uy{SP^{5s1Y-Swp3T=BWs$c_7j9KfS#^h z7JAF^g%^ViI`xbJ*psVY{4$6;n=_(kQOyLPfD~o?2jh0gH#;ubnRFy)ZH-^p8Z{8(zX zhvTg>kfJa$Q_12ea0Zm+uyk~8JCXHl2OO#7=q-Xx~}R!K&}h|GOxg+rvLb zfDpPZ_5(?D3zT$Ux4S`O))0b$8O`9Lf2U3EoKoxVNA-kMKW%CSK_=WRfAKp28Ft7J zd|)5vZPTG3dsJsA8JE3&UT*jcSD2Jb1o0^2e#L5z=~V8q-;i4B!Q)neD7DSA1ftkj z;ez3IRvhWm4~zP0Bya8I6hJCMAGDdPi-wM{82kD5Zd62RX5nq$>&avhSxvuQ#!&)T+9`Xm%>l#2R{3XDqtT6fmi9M!6b_`;dO6y(cpAZfx zrXXcDQ;pl z;gb^|{k}6VNIt5+sxM0h94pqY?@63|X7l_V^HJwLZ>hhzR>GE=P8wgwD9G2*G z4%aCZWk zq3m`yCJMzDvNY;n4*nfygYRBF=gzDl#C9Gjmg+hBx&RVOqg1mkR7n{2TJTMzyXs}c zr)~bx$kokoM3gtuUW4Y3^f5sO7V-)B@O++8|981eyI(8K(sxmUbfUq1BMo?Q;9Obs z%GyaD{=gx%WTX=+z9sUt-Sx%a=_`eU+Xv+^una5;4$p$Q%Q~8xvMX2|O{&W}VESnm zj0ahsJJ@fcNC6;KS1b$_f2@z*d0yq97A`&+70t-eWXi>%K5Ku_JZoBe{LM-xi|%kx z)LFwrIvPbTPP=1nmkl6Qxi=9-=XG4y3$YWP21;h5I+-AG}4Np7~yY31!-Uq zg8x=V{@?VHNq!_f|8o%j_w|2QPlowFcY%R0ftpj3Y2Ja?fd8-MUPUp$`WgREFaN)6 z=>PPh|D)CX|7tY Date: Wed, 18 Oct 2023 22:05:48 +0200 Subject: [PATCH 6/6] Wear Remove AAPS V2 Watchface --- wear/src/main/AndroidManifest.xml | 26 -- .../app/aaps/wear/di/WearServicesModule.kt | 2 - .../aaps/wear/watchfaces/AapsV2Watchface.kt | 172 ----------- .../watchfaces/utils/WatchfaceViewAdapter.kt | 62 ++-- wear/src/main/res/layout/activity_home_2.xml | 285 ------------------ wear/src/main/res/values/strings.xml | 1 - .../xml/watch_face_configuration_home2.xml | 42 --- 7 files changed, 29 insertions(+), 561 deletions(-) delete mode 100644 wear/src/main/kotlin/app/aaps/wear/watchfaces/AapsV2Watchface.kt delete mode 100644 wear/src/main/res/layout/activity_home_2.xml delete mode 100644 wear/src/main/res/xml/watch_face_configuration_home2.xml diff --git a/wear/src/main/AndroidManifest.xml b/wear/src/main/AndroidManifest.xml index 0a21c75013..78b8b21191 100644 --- a/wear/src/main/AndroidManifest.xml +++ b/wear/src/main/AndroidManifest.xml @@ -95,31 +95,6 @@ - - - - - - - - - - - - - - - diff --git a/wear/src/main/kotlin/app/aaps/wear/di/WearServicesModule.kt b/wear/src/main/kotlin/app/aaps/wear/di/WearServicesModule.kt index 9a7f137b0f..e1be969b11 100644 --- a/wear/src/main/kotlin/app/aaps/wear/di/WearServicesModule.kt +++ b/wear/src/main/kotlin/app/aaps/wear/di/WearServicesModule.kt @@ -20,7 +20,6 @@ import app.aaps.wear.tile.QuickWizardTileService import app.aaps.wear.tile.TempTargetTileService import app.aaps.wear.tile.TileBase import app.aaps.wear.watchfaces.AapsLargeWatchface -import app.aaps.wear.watchfaces.AapsV2Watchface import app.aaps.wear.watchfaces.AapsWatchface import app.aaps.wear.watchfaces.BigChartWatchface import app.aaps.wear.watchfaces.CircleWatchface @@ -53,7 +52,6 @@ abstract class WearServicesModule { @ContributesAndroidInjector abstract fun contributesBaseWatchFace(): BaseWatchFace @ContributesAndroidInjector abstract fun contributesAapsWatchface(): AapsWatchface - @ContributesAndroidInjector abstract fun contributesAapsV2Watchface(): AapsV2Watchface @ContributesAndroidInjector abstract fun contributesAapsLargeWatchface(): AapsLargeWatchface @ContributesAndroidInjector abstract fun contributesDigitalStyleWatchface(): DigitalStyleWatchface @ContributesAndroidInjector abstract fun contributesBIGChart(): BigChartWatchface diff --git a/wear/src/main/kotlin/app/aaps/wear/watchfaces/AapsV2Watchface.kt b/wear/src/main/kotlin/app/aaps/wear/watchfaces/AapsV2Watchface.kt deleted file mode 100644 index df7723998d..0000000000 --- a/wear/src/main/kotlin/app/aaps/wear/watchfaces/AapsV2Watchface.kt +++ /dev/null @@ -1,172 +0,0 @@ -package app.aaps.wear.watchfaces - -import android.graphics.Color -import android.view.LayoutInflater -import androidx.annotation.ColorInt -import androidx.core.content.ContextCompat -import androidx.viewbinding.ViewBinding -import app.aaps.wear.R -import app.aaps.wear.databinding.ActivityHome2Binding -import app.aaps.wear.watchfaces.utils.BaseWatchFace -import com.ustwo.clockwise.common.WatchMode - -class AapsV2Watchface : BaseWatchFace() { - - private lateinit var binding: ActivityHome2Binding - - override fun inflateLayout(inflater: LayoutInflater): ViewBinding { - binding = ActivityHome2Binding.inflate(inflater) - return binding - } - - override fun setColorDark() { - @ColorInt val dividerTxtColor = if (dividerMatchesBg) ContextCompat.getColor(this, R.color.dark_midColor) else Color.BLACK - @ColorInt val dividerBatteryOkColor = ContextCompat.getColor(this, if (dividerMatchesBg) R.color.dark_midColor else R.color.dark_uploaderBattery) - @ColorInt val dividerBgColor = ContextCompat.getColor(this, if (dividerMatchesBg) R.color.dark_background else R.color.dark_statusView) - binding.secondaryLayout.setBackgroundColor(dividerBgColor) - binding.tertiaryLayout.setBackgroundColor(ContextCompat.getColor(this, R.color.dark_background)) - binding.mainLayout.setBackgroundColor(ContextCompat.getColor(this, R.color.dark_background)) - binding.time.setTextColor(ContextCompat.getColor(this, R.color.dark_midColor)) - binding.iob1.setTextColor(ContextCompat.getColor(this, R.color.dark_midColor)) - binding.iob2.setTextColor(ContextCompat.getColor(this, R.color.dark_midColor)) - binding.cob1.setTextColor(ContextCompat.getColor(this, R.color.dark_midColor)) - binding.cob2.setTextColor(ContextCompat.getColor(this, R.color.dark_midColor)) - binding.day.setTextColor(ContextCompat.getColor(this, R.color.dark_midColor)) - binding.month.setTextColor(ContextCompat.getColor(this, R.color.dark_midColor)) - binding.loop.setTextColor(ContextCompat.getColor(this, R.color.dark_midColor)) - setTextSizes() - val color = when (singleBg.sgvLevel) { - 1L -> R.color.dark_highColor - 0L -> R.color.dark_midColor - -1L -> R.color.dark_lowColor - else -> R.color.dark_midColor - } - binding.sgv.setTextColor(ContextCompat.getColor(this, color)) - binding.direction.setTextColor(ContextCompat.getColor(this, color)) - - val colorTime = if (ageLevel == 1) R.color.dark_midColor else R.color.dark_TimestampOld - binding.timestamp.setTextColor(ContextCompat.getColor(this, colorTime)) - val colourBat = if (status.batteryLevel == 1) dividerBatteryOkColor else ContextCompat.getColor(this, R.color.dark_uploaderBatteryEmpty) - binding.uploaderBattery.setTextColor(colourBat) - - binding.rigBattery.setTextColor(dividerTxtColor) - binding.delta.setTextColor(dividerTxtColor) - binding.avgDelta.setTextColor(dividerTxtColor) - binding.basalRate.setTextColor(dividerTxtColor) - binding.bgi.setTextColor(dividerTxtColor) - when (loopLevel) { - -1 -> binding.loop.setBackgroundResource(R.drawable.loop_grey_25) - 1 -> binding.loop.setBackgroundResource(R.drawable.loop_green_25) - else -> binding.loop.setBackgroundResource(R.drawable.loop_red_25) - } - - highColor = ContextCompat.getColor(this, R.color.dark_highColor) - lowColor = ContextCompat.getColor(this, R.color.dark_lowColor) - midColor = ContextCompat.getColor(this, R.color.dark_midColor) - gridColor = ContextCompat.getColor(this, R.color.dark_gridColor) - basalBackgroundColor = ContextCompat.getColor(this, R.color.basal_dark) - basalCenterColor = ContextCompat.getColor(this, R.color.basal_light) - pointSize = 2 - setupCharts() - } - - override fun setColorLowRes() { - @ColorInt val dividerTxtColor = if (dividerMatchesBg) ContextCompat.getColor(this, R.color.dark_midColor) else Color.BLACK - @ColorInt val dividerBgColor = ContextCompat.getColor(this, if (dividerMatchesBg) R.color.dark_background else R.color.dark_statusView) - binding.secondaryLayout.setBackgroundColor(dividerBgColor) - binding.tertiaryLayout.setBackgroundColor(ContextCompat.getColor(this, R.color.dark_background)) - binding.mainLayout.setBackgroundColor(ContextCompat.getColor(this, R.color.dark_background)) - binding.loop.setBackgroundResource(R.drawable.loop_grey_25) - binding.loop.setTextColor(ContextCompat.getColor(this, R.color.dark_midColor)) - binding.sgv.setTextColor(ContextCompat.getColor(this, R.color.dark_midColor)) - binding.direction.setTextColor(ContextCompat.getColor(this, R.color.dark_midColor)) - binding.timestamp.setTextColor(ContextCompat.getColor(this, R.color.dark_Timestamp)) - binding.delta.setTextColor(dividerTxtColor) - binding.avgDelta.setTextColor(dividerTxtColor) - binding.rigBattery.setTextColor(dividerTxtColor) - binding.uploaderBattery.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)) - binding.cob1.setTextColor(ContextCompat.getColor(this, R.color.dark_midColor)) - binding.cob2.setTextColor(ContextCompat.getColor(this, R.color.dark_midColor)) - binding.day.setTextColor(ContextCompat.getColor(this, R.color.dark_midColor)) - binding.month.setTextColor(ContextCompat.getColor(this, R.color.dark_midColor)) - binding.time.setTextColor(ContextCompat.getColor(this, R.color.dark_mTime)) - - highColor = ContextCompat.getColor(this, R.color.dark_midColor) - lowColor = ContextCompat.getColor(this, R.color.dark_midColor) - midColor = ContextCompat.getColor(this, R.color.dark_midColor) - gridColor = ContextCompat.getColor(this, R.color.dark_gridColor) - basalBackgroundColor = ContextCompat.getColor(this, R.color.basal_dark_lowres) - basalCenterColor = ContextCompat.getColor(this, R.color.basal_light_lowres) - pointSize = 2 - setupCharts() - - setTextSizes() - } - - override fun setColorBright() { - if (currentWatchMode == WatchMode.INTERACTIVE) { - @ColorInt val dividerTxtColor = if (dividerMatchesBg) Color.BLACK else ContextCompat.getColor(this, R.color.dark_midColor) - @ColorInt val dividerBgColor = ContextCompat.getColor(this, if (dividerMatchesBg) R.color.light_background else R.color.light_stripe_background) - binding.secondaryLayout.setBackgroundColor(dividerBgColor) - binding.tertiaryLayout.setBackgroundColor(ContextCompat.getColor(this, R.color.light_background)) - binding.mainLayout.setBackgroundColor(ContextCompat.getColor(this, R.color.light_background)) - binding.time.setTextColor(Color.BLACK) - binding.iob1.setTextColor(Color.BLACK) - binding.iob2.setTextColor(Color.BLACK) - binding.cob1.setTextColor(Color.BLACK) - binding.cob2.setTextColor(Color.BLACK) - binding.day.setTextColor(Color.BLACK) - binding.month.setTextColor(Color.BLACK) - binding.loop.setTextColor(Color.BLACK) - setTextSizes() - val color = when (singleBg.sgvLevel) { - 1L -> R.color.light_highColor - 0L -> R.color.light_midColor - -1L -> R.color.light_lowColor - else -> R.color.light_midColor - } - binding.sgv.setTextColor(ContextCompat.getColor(this, color)) - binding.direction.setTextColor(ContextCompat.getColor(this, color)) - val colorTime = if (ageLevel == 1) Color.BLACK else Color.RED - binding.timestamp.setTextColor(colorTime) - val colourBat = if (status.batteryLevel == 1) dividerTxtColor else Color.RED - binding.uploaderBattery.setTextColor(colourBat) - binding.rigBattery.setTextColor(dividerTxtColor) - binding.delta.setTextColor(dividerTxtColor) - binding.avgDelta.setTextColor(dividerTxtColor) - binding.basalRate.setTextColor(dividerTxtColor) - binding.bgi.setTextColor(dividerTxtColor) - when (loopLevel) { - -1 -> binding.loop.setBackgroundResource(R.drawable.loop_grey_25) - 1 -> binding.loop.setBackgroundResource(R.drawable.loop_green_25) - else -> binding.loop.setBackgroundResource(R.drawable.loop_red_25) - } - - highColor = ContextCompat.getColor(this, R.color.light_highColor) - lowColor = ContextCompat.getColor(this, R.color.light_lowColor) - midColor = ContextCompat.getColor(this, R.color.light_midColor) - gridColor = ContextCompat.getColor(this, R.color.light_gridColor) - basalBackgroundColor = ContextCompat.getColor(this, R.color.basal_light) - basalCenterColor = ContextCompat.getColor(this, R.color.basal_dark) - pointSize = 2 - setupCharts() - - } else { - setColorDark() - } - } - - private fun setTextSizes() { - if (detailedIob) { - binding.iob1.textSize = 14f - binding.iob2.textSize = 10f - } else { - binding.iob1.textSize = 10f - binding.iob2.textSize = 14f - } - } -} diff --git a/wear/src/main/kotlin/app/aaps/wear/watchfaces/utils/WatchfaceViewAdapter.kt b/wear/src/main/kotlin/app/aaps/wear/watchfaces/utils/WatchfaceViewAdapter.kt index 18c06f1ef1..8e89ddc8e2 100644 --- a/wear/src/main/kotlin/app/aaps/wear/watchfaces/utils/WatchfaceViewAdapter.kt +++ b/wear/src/main/kotlin/app/aaps/wear/watchfaces/utils/WatchfaceViewAdapter.kt @@ -4,7 +4,6 @@ import androidx.viewbinding.ViewBinding import app.aaps.wear.databinding.ActivityBigchartBinding import app.aaps.wear.databinding.ActivityCustomBinding import app.aaps.wear.databinding.ActivityDigitalstyleBinding -import app.aaps.wear.databinding.ActivityHome2Binding import app.aaps.wear.databinding.ActivityHomeBinding import app.aaps.wear.databinding.ActivityHomeLargeBinding import app.aaps.wear.databinding.ActivityNochartBinding @@ -15,7 +14,6 @@ import app.aaps.wear.databinding.ActivityNochartBinding */ class WatchfaceViewAdapter( aL: ActivityHomeLargeBinding? = null, - a2: ActivityHome2Binding? = null, aa: ActivityHomeBinding? = null, bC: ActivityBigchartBinding? = null, ds: ActivityDigitalstyleBinding? = null, @@ -24,7 +22,7 @@ class WatchfaceViewAdapter( ) { init { - if (aL == null && a2 == null && aa == null && bC == null && ds == null && nC == null && cU == null) { + if (aL == null && aa == null && bC == null && ds == null && nC == null && cU == null) { throw IllegalArgumentException("Require at least on Binding parameter") } } @@ -33,47 +31,46 @@ class WatchfaceViewAdapter( // Required attributes val mainLayout = - aL?.mainLayout ?: a2?.mainLayout ?: aa?.mainLayout ?: bC?.mainLayout ?: bC?.mainLayout ?: ds?.mainLayout ?: nC?.mainLayout ?: cU?.mainLayout + aL?.mainLayout ?: aa?.mainLayout ?: bC?.mainLayout ?: bC?.mainLayout ?: ds?.mainLayout ?: nC?.mainLayout ?: cU?.mainLayout ?: throw IllegalArgumentException(errorMessage) val timestamp = - aL?.timestamp ?: a2?.timestamp ?: aa?.timestamp ?: bC?.timestamp ?: bC?.timestamp ?: ds?.timestamp ?: nC?.timestamp ?: cU?.timestamp + aL?.timestamp ?: aa?.timestamp ?: bC?.timestamp ?: bC?.timestamp ?: ds?.timestamp ?: nC?.timestamp ?: cU?.timestamp ?: throw IllegalArgumentException(errorMessage) val root = - aL?.root ?: a2?.root ?: aa?.root ?: bC?.root ?: bC?.root ?: ds?.root ?: nC?.root ?: cU?.root + aL?.root ?: aa?.root ?: bC?.root ?: bC?.root ?: ds?.root ?: nC?.root ?: cU?.root ?: throw IllegalArgumentException(errorMessage) // Optional attributes - val sgv = aL?.sgv ?: a2?.sgv ?: aa?.sgv ?: bC?.sgv ?: bC?.sgv ?: ds?.sgv ?: nC?.sgv ?: cU?.sgv - val direction = aL?.direction ?: a2?.direction ?: aa?.direction ?: ds?.direction - val loop = a2?.loop ?: cU?.loop - val delta = aL?.delta ?: a2?.delta ?: aa?.delta ?: bC?.delta ?: bC?.delta ?: ds?.delta ?: nC?.delta ?: cU?.delta - val avgDelta = a2?.avgDelta ?: bC?.avgDelta ?: bC?.avgDelta ?: ds?.avgDelta ?: nC?.avgDelta ?: cU?.avgDelta - val uploaderBattery = aL?.uploaderBattery ?: a2?.uploaderBattery ?: aa?.uploaderBattery ?: ds?.uploaderBattery ?: cU?.uploaderBattery - val rigBattery = a2?.rigBattery ?: ds?.rigBattery ?: cU?.rigBattery - val basalRate = a2?.basalRate ?: ds?.basalRate ?: cU?.basalRate - val bgi = a2?.bgi ?: ds?.bgi ?: cU?.bgi - val AAPSv2 = a2?.AAPSv2 ?: ds?.AAPSv2 ?: cU?.AAPSv2 - val cob1 = a2?.cob1 ?: ds?.cob1 ?: cU?.cob1 - val cob2 = a2?.cob2 ?: ds?.cob2 ?: cU?.cob2 - val time = aL?.time ?: a2?.time ?: aa?.time ?: bC?.time ?: bC?.time ?: nC?.time ?: cU?.time + val sgv = aL?.sgv ?: aa?.sgv ?: bC?.sgv ?: bC?.sgv ?: ds?.sgv ?: nC?.sgv ?: cU?.sgv + val direction = aL?.direction ?: aa?.direction ?: ds?.direction + val loop = cU?.loop + val delta = aL?.delta ?: aa?.delta ?: bC?.delta ?: bC?.delta ?: ds?.delta ?: nC?.delta ?: cU?.delta + val avgDelta = bC?.avgDelta ?: bC?.avgDelta ?: ds?.avgDelta ?: nC?.avgDelta ?: cU?.avgDelta + val uploaderBattery = aL?.uploaderBattery ?: aa?.uploaderBattery ?: ds?.uploaderBattery ?: cU?.uploaderBattery + val rigBattery = ds?.rigBattery ?: cU?.rigBattery + val basalRate = ds?.basalRate ?: cU?.basalRate + val bgi = ds?.bgi ?: cU?.bgi + val AAPSv2 = ds?.AAPSv2 ?: cU?.AAPSv2 + val cob1 = ds?.cob1 ?: cU?.cob1 + val cob2 = ds?.cob2 ?: cU?.cob2 + val time = aL?.time ?: aa?.time ?: bC?.time ?: bC?.time ?: nC?.time ?: cU?.time val second = cU?.second val minute = ds?.minute ?: cU?.minute val hour = ds?.hour ?: cU?.hour - val day = a2?.day ?: ds?.day ?: cU?.day - val month = a2?.month ?: ds?.month ?: cU?.month - val iob1 = a2?.iob1 ?: ds?.iob1 ?: cU?.iob1 - val iob2 = a2?.iob2 ?: ds?.iob2 ?: cU?.iob2 - val chart = a2?.chart ?: aa?.chart ?: bC?.chart ?: bC?.chart ?: ds?.chart ?: cU?.chart + val day = ds?.day ?: cU?.day + val month = ds?.month ?: cU?.month + val iob1 = ds?.iob1 ?: cU?.iob1 + val iob2 = ds?.iob2 ?: cU?.iob2 + val chart = aa?.chart ?: bC?.chart ?: bC?.chart ?: ds?.chart ?: cU?.chart val status = aL?.status ?: aa?.status ?: bC?.status ?: bC?.status ?: nC?.status val timePeriod = ds?.timePeriod ?: aL?.timePeriod ?: nC?.timePeriod ?: bC?.timePeriod ?: cU?.timePeriod val dayName = ds?.dayName ?: cU?.dayName val mainMenuTap = ds?.mainMenuTap val chartZoomTap = ds?.chartZoomTap - val dateTime = ds?.dateTime ?: a2?.dateTime + val dateTime = ds?.dateTime val weekNumber = ds?.weekNumber ?: cU?.weekNumber // val minuteHand = cU?.minuteHand - // val secondaryLayout = aL?.secondaryLayout ?: a2?.secondaryLayout ?: aa?.secondaryLayout ?: ds?.secondaryLayout - // val tertiaryLayout = a2?.tertiaryLayout + // val secondaryLayout = aL?.secondaryLayout ?: aa?.secondaryLayout ?: ds?.secondaryLayout // val hourHand = cU?.hourHand companion object { @@ -81,12 +78,11 @@ class WatchfaceViewAdapter( fun getBinding(bindLayout: ViewBinding): WatchfaceViewAdapter { return when (bindLayout) { is ActivityHomeLargeBinding -> WatchfaceViewAdapter(bindLayout) - is ActivityHome2Binding -> WatchfaceViewAdapter(null, bindLayout) - is ActivityHomeBinding -> WatchfaceViewAdapter(null, null, bindLayout) - is ActivityBigchartBinding -> WatchfaceViewAdapter(null, null, null, bindLayout) - is ActivityDigitalstyleBinding -> WatchfaceViewAdapter(null, null, null, null, bindLayout) - is ActivityNochartBinding -> WatchfaceViewAdapter(null, null, null, null, null, bindLayout) - is ActivityCustomBinding -> WatchfaceViewAdapter(null, null, null, null, null, null, bindLayout) + is ActivityHomeBinding -> WatchfaceViewAdapter(null, bindLayout) + is ActivityBigchartBinding -> WatchfaceViewAdapter(null, null, bindLayout) + is ActivityDigitalstyleBinding -> WatchfaceViewAdapter(null, null, null, bindLayout) + is ActivityNochartBinding -> WatchfaceViewAdapter(null, null, null, null, bindLayout) + is ActivityCustomBinding -> WatchfaceViewAdapter(null, null, null, null, null, bindLayout) else -> throw IllegalArgumentException("ViewBinding is not implement in WatchfaceViewAdapter") } } diff --git a/wear/src/main/res/layout/activity_home_2.xml b/wear/src/main/res/layout/activity_home_2.xml deleted file mode 100644 index 0244393e33..0000000000 --- a/wear/src/main/res/layout/activity_home_2.xml +++ /dev/null @@ -1,285 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/wear/src/main/res/values/strings.xml b/wear/src/main/res/values/strings.xml index 6599af1430..285977b53a 100644 --- a/wear/src/main/res/values/strings.xml +++ b/wear/src/main/res/values/strings.xml @@ -7,7 +7,6 @@ AAPS(BigChart) AAPS(NoChart) AAPS(Circle) - AAPS(v2) AAPS(DigitalStyle) AAPS(Custom) AAPS(Actions) diff --git a/wear/src/main/res/xml/watch_face_configuration_home2.xml b/wear/src/main/res/xml/watch_face_configuration_home2.xml deleted file mode 100644 index 3d86ad7cc6..0000000000 --- a/wear/src/main/res/xml/watch_face_configuration_home2.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - -