Initial commit

This commit is contained in:
Will Bradley
2025-02-18 23:52:32 -08:00
commit 2860830bcc
34 changed files with 1266 additions and 0 deletions

View File

@@ -0,0 +1,48 @@
/*
* Copyright 2024 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.android)
// Use the locally-defined validator to demonstrate validation on-build.
id("com.google.wff.validatorplugin")
}
android {
namespace = "com.example.weather"
compileSdk = 34
defaultConfig {
applicationId = "com.example.weather"
// Weather requires version 2 of the watch face format, which is
// supported from Wear OS 5 onwards.
minSdk = 34
targetSdk = 34
versionCode = 1
versionName = "1.0.0"
}
buildTypes {
release {
// TODO:Add your signingConfig here to build release builds
isMinifyEnabled = true
// Ensure shrink resources is false, to avoid potential for them
// being removed.
isShrinkResources = false
signingConfig = signingConfigs.getByName("debug")
}
}
}

View File

@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!--
Copyright 2023 Google LLC
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-feature android:name="android.hardware.type.watch" />
<!-- Note: hasCode is required to be false for Watch Face Format -->
<application
android:label="@string/watch_face_name"
android:hasCode="false">
<!--
This watch face uses Flavors, which requires version 2 of the Watch Face
Format.
-->
<property
android:name="com.google.wear.watchface.format.version"
android:value="2" />
<meta-data android:name="com.google.android.wearable.standalone"
android:value="true"/>
</application>
</manifest>

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 841 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1001 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 588 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 700 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,704 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<WatchFace height="450" width="450">
<Scene>
<Group height="450" name="Root" width="450" x="0" y="0">
<PartDraw height="450" name="BackgroundContour" width="450" x="0" y="0">
<Ellipse height="450.0" width="450.0" x="0.0" y="0.0">
<Stroke color="#fffefbea" thickness="10.0"/>
<Fill color="#ffe6e3d3"/>
</Ellipse>
</PartDraw>
<Group height="450" name="Wrapper" width="450" x="15" y="0">
<PartText height="50" width="430" x="0" y="0">
<Localization calendar="GREGORIAN" timeZone="SYNC_TO_DEVICE"/>
<Text>
<Font family="anaktoria" size="42" color="#99000000"> It is </Font>
</Text>
</PartText>
<PartText height="200" width="430" x="0" y="20">
<Localization calendar="GREGORIAN" timeZone="SYNC_TO_DEVICE"/>
<Text>
<Font family="anaktoria" size="130" color="#ff000000">
<Template><![CDATA[ %s ]]>
<Parameter expression="
[HOUR_1_12] == 1 ? one :
[HOUR_1_12] == 2 ? two :
[HOUR_1_12] == 3 ? three :
[HOUR_1_12] == 4 ? four :
[HOUR_1_12] == 5 ? five :
[HOUR_1_12] == 6 ? six :
[HOUR_1_12] == 7 ? seven :
[HOUR_1_12] == 8 ? eight :
[HOUR_1_12] == 9 ? nine :
[HOUR_1_12] == 10 ? ten :
[HOUR_1_12] == 11 ? eleven :
[HOUR_1_12] == 12 ? twelve :
[HOUR_1_12_Z]"/>
</Template>
</Font>
</Text>
</PartText>
<PartText height="180" width="450" x="0" y="110">
<Localization calendar="GREGORIAN" timeZone="SYNC_TO_DEVICE"/>
<Text>
<Font family="anaktoria" size="70" color="#cc000000">
<Template><![CDATA[ %s ]]>
<Parameter expression="
[MINUTE] == 0 ? o'clock :
[MINUTE] == 1 ? &quot;oh-one&quot; :
[MINUTE] == 2 ? &quot;oh-two&quot; :
[MINUTE] == 3 ? &quot;oh-three&quot; :
[MINUTE] == 4 ? &quot;oh-four&quot; :
[MINUTE] == 5 ? &quot;oh-five&quot; :
[MINUTE] == 6 ? &quot;oh-six&quot; :
[MINUTE] == 7 ? &quot;oh-seven&quot; :
[MINUTE] == 8 ? &quot;oh-eight&quot; :
[MINUTE] == 9 ? &quot;oh-nine&quot; :
[MINUTE] == 10 ? ten :
[MINUTE] == 11 ? eleven :
[MINUTE] == 12 ? twelve :
[MINUTE] == 13 ? thirteen :
[MINUTE] == 14 ? fourteen :
[MINUTE] == 15 ? fifteen :
[MINUTE] == 16 ? sixteen :
[MINUTE] == 17 ? seventeen :
[MINUTE] == 18 ? eighteen :
[MINUTE] == 19 ? nineteen :
[MINUTE] == 20 ? twenty :
[MINUTE] == 21 ? &quot;twenty-one&quot; :
[MINUTE] == 22 ? &quot;twenty-two&quot; :
[MINUTE] == 23 ? &quot;twenty-three&quot; :
[MINUTE] == 24 ? &quot;twenty-four&quot; :
[MINUTE] == 25 ? &quot;twenty-five&quot; :
[MINUTE] == 26 ? &quot;twenty-six&quot; :
[MINUTE] == 27 ? &quot;twenty-seven&quot; :
[MINUTE] == 28 ? &quot;twenty-eight&quot; :
[MINUTE] == 29 ? &quot;twenty-nine&quot; :
[MINUTE] == 30 ? thirty :
[MINUTE] == 31 ? &quot;thirty-one&quot; :
[MINUTE] == 32 ? &quot;thirty-two&quot; :
[MINUTE] == 33 ? &quot;thirty-three&quot; :
[MINUTE] == 34 ? &quot;thirty-four&quot; :
[MINUTE] == 35 ? &quot;thirty-five&quot; :
[MINUTE] == 36 ? &quot;thirty-six&quot; :
[MINUTE] == 37 ? &quot;thirty-seven&quot; :
[MINUTE] == 38 ? &quot;thirty-eight&quot; :
[MINUTE] == 39 ? &quot;thirty-nine&quot; :
[MINUTE] == 40 ? forty :
[MINUTE] == 41 ? &quot;forty-one&quot; :
[MINUTE] == 42 ? &quot;forty-two&quot; :
[MINUTE] == 43 ? &quot;forty-three&quot; :
[MINUTE] == 44 ? &quot;forty-four&quot; :
[MINUTE] == 45 ? &quot;forty-five&quot; :
[MINUTE] == 46 ? &quot;forty-six&quot; :
[MINUTE] == 47 ? &quot;forty-seven&quot; :
[MINUTE] == 48 ? &quot;forty-eight&quot; :
[MINUTE] == 49 ? &quot;forty-nine&quot; :
[MINUTE] == 50 ? fifty :
[MINUTE] == 51 ? &quot;fifty-one&quot; :
[MINUTE] == 52 ? &quot;fifty-two&quot; :
[MINUTE] == 53 ? &quot;fifty-three&quot; :
[MINUTE] == 54 ? &quot;fifty-four&quot; :
[MINUTE] == 55 ? &quot;fifty-five&quot; :
[MINUTE] == 56 ? &quot;fifty-six&quot; :
[MINUTE] == 57 ? &quot;fifty-seven&quot; :
[MINUTE] == 58 ? &quot;fifty-eight&quot; :
[MINUTE] == 59 ? &quot;fifty-nine&quot; :
[MINUTE] == 60 ? sixty :
[MINUTE_Z]"/>
</Template>
</Font>
</Text>
</PartText>
<PartText height="75" width="430" x="0" y="225">
<Localization calendar="GREGORIAN" timeZone="SYNC_TO_DEVICE"/>
<Text>
<Font family="anaktoria" size="36" color="#aa000000">
<Template><![CDATA[ and %s %s ]]>
<Parameter expression="
[SECOND] == 0 ? zero :
[SECOND] == 1 ? one :
[SECOND] == 2 ? two :
[SECOND] == 3 ? three :
[SECOND] == 4 ? four :
[SECOND] == 5 ? five :
[SECOND] == 6 ? six :
[SECOND] == 7 ? seven :
[SECOND] == 8 ? eight :
[SECOND] == 9 ? nine :
[SECOND] == 10 ? ten :
[SECOND] == 11 ? eleven :
[SECOND] == 12 ? twelve :
[SECOND] == 13 ? thirteen :
[SECOND] == 14 ? fourteen :
[SECOND] == 15 ? fifteen :
[SECOND] == 16 ? sixteen :
[SECOND] == 17 ? seventeen :
[SECOND] == 18 ? eighteen :
[SECOND] == 19 ? nineteen :
[SECOND] == 20 ? twenty :
[SECOND] == 21 ? &quot;twenty-one&quot; :
[SECOND] == 22 ? &quot;twenty-two&quot; :
[SECOND] == 23 ? &quot;twenty-three&quot; :
[SECOND] == 24 ? &quot;twenty-four&quot; :
[SECOND] == 25 ? &quot;twenty-five&quot; :
[SECOND] == 26 ? &quot;twenty-six&quot; :
[SECOND] == 27 ? &quot;twenty-seven&quot; :
[SECOND] == 28 ? &quot;twenty-eight&quot; :
[SECOND] == 29 ? &quot;twenty-nine&quot; :
[SECOND] == 30 ? thirty :
[SECOND] == 31 ? &quot;thirty-one&quot; :
[SECOND] == 32 ? &quot;thirty-two&quot; :
[SECOND] == 33 ? &quot;thirty-three&quot; :
[SECOND] == 34 ? &quot;thirty-four&quot; :
[SECOND] == 35 ? &quot;thirty-five&quot; :
[SECOND] == 36 ? &quot;thirty-six&quot; :
[SECOND] == 37 ? &quot;thirty-seven&quot; :
[SECOND] == 38 ? &quot;thirty-eight&quot; :
[SECOND] == 39 ? &quot;thirty-nine&quot; :
[SECOND] == 40 ? forty :
[SECOND] == 41 ? &quot;forty-one&quot; :
[SECOND] == 42 ? &quot;forty-two&quot; :
[SECOND] == 43 ? &quot;forty-three&quot; :
[SECOND] == 44 ? &quot;forty-four&quot; :
[SECOND] == 45 ? &quot;forty-five&quot; :
[SECOND] == 46 ? &quot;forty-six&quot; :
[SECOND] == 47 ? &quot;forty-seven&quot; :
[SECOND] == 48 ? &quot;forty-eight&quot; :
[SECOND] == 49 ? &quot;forty-nine&quot; :
[SECOND] == 50 ? fifty :
[SECOND] == 51 ? &quot;fifty-one&quot; :
[SECOND] == 52 ? &quot;fifty-two&quot; :
[SECOND] == 53 ? &quot;fifty-three&quot; :
[SECOND] == 54 ? &quot;fifty-four&quot; :
[SECOND] == 55 ? &quot;fifty-five&quot; :
[SECOND] == 56 ? &quot;fifty-six&quot; :
[SECOND] == 57 ? &quot;fifty-seven&quot; :
[SECOND] == 58 ? &quot;fifty-eight&quot; :
[SECOND] == 59 ? &quot;fifty-nine&quot; :
[SECOND] == 60 ? sixty :
[SECOND_Z]"/>
<Parameter expression="[SECOND] == 1 ? second : seconds"/>
</Template>
</Font>
</Text>
</PartText>
<PartText height="50" width="430" x="0" y="275">
<Localization calendar="GREGORIAN" timeZone="SYNC_TO_DEVICE"/>
<Text>
<Font family="anaktoria" size="36" color="#99000000">
<Template><![CDATA[ in the %s ]]>
<Parameter expression="
[HOUR_1_24] &lt; 12 ? morning :
[HOUR_1_24] &lt; 17 ? afternoon :
evening"/>
</Template>
</Font>
</Text>
</PartText>
<PartText height="50" width="430" x="0" y="330">
<Localization calendar="GREGORIAN" timeZone="SYNC_TO_DEVICE"/>
<Text>
<Font family="anaktoria" size="36" color="#66000000">
<Template><![CDATA[ %s ]]>
<Parameter expression="[DAY_OF_WEEK_F]"/>
</Template>
</Font>
</Text>
</PartText>
<PartText height="50" width="430" x="0" y="365">
<Localization calendar="GREGORIAN" timeZone="SYNC_TO_DEVICE"/>
<Text>
<Font family="anaktoria" size="36" color="#66000000">
<Template><![CDATA[ %s %s ]]>
<Parameter expression="[MONTH_F]"/>
<Parameter expression="[DAY_Z]"/>
</Template>
</Font>
</Text>
</PartText>
</Group>
</Group>
<ComplicationSlot
x="2" y="195"
width="60" height="60"
slotId="0"
name="left_complication" displayName="Left"
supportedTypes="RANGED_VALUE">
<!--
There is no guarantee that the primaryProvider component name is
available on the device. Therefore defaultSystemProvider is mandatory in
DefaultSystemProvider, to provide a fallback.
System providers are listed here: https://developer.android.com/reference/android/support/wearable/complications/SystemProviders.html
-->
<DefaultProviderPolicy
primaryProvider="com.fitbit.FitbitMobile/com.fitbit.complications.calories.CaloriesComplicationDataSourceService"
primaryProviderType="RANGED_VALUE"
defaultSystemProvider="STEP_COUNT"
defaultSystemProviderType="RANGED_VALUE"
/>
<!--
Several different bounding shapes are supported in WFF, see:
https://developer.android.com/training/wearables/wff/complication/bounding
This example= only demonstrates a round complication.
-->
<BoundingOval x="0" y="0" width="60" height="60" outlinePadding="2" />
<!--
Basic example of a Ranged Value complication.
Ranged Value complications support optional data fields:
- Text
- Title
- Monochromatic Image
(Note that although AndroidX RangedValueComplicationData supports
containing SmallImage, Watch Face format does not expose these, so you
should use Monochromatic Image for icons.)
At least one of these must be set. This condition and set of expressions
evaluates which combination has been provided by the data source and
renders accordingly.
-->
<Complication type="RANGED_VALUE">
<Group name="ranged_value_ring_ambient" x="0" y="0" width="60" height="60" alpha="0">
<Variant mode="AMBIENT" target="alpha" value="255" />
<PartDraw x="0" y="0" height="60" width="60">
<Arc direction="CLOCKWISE" startAngle="-150" endAngle="150" centerX="30" centerY="30" width="50" height="50">
<Stroke color="[CONFIGURATION.themeColor.3]" cap="ROUND" thickness="10" />
</Arc>
</PartDraw>
<PartDraw x="0" y="0" height="60" width="60" >
<Arc direction="CLOCKWISE" startAngle="-150" endAngle="150" centerX="30" centerY="30" width="50" height="50">
<Transform target="endAngle" value="-150 + (((clamp(([COMPLICATION.RANGED_VALUE_VALUE]), ([COMPLICATION.RANGED_VALUE_MIN]), ([COMPLICATION.RANGED_VALUE_MAX])) - ([COMPLICATION.RANGED_VALUE_MIN])) / (([COMPLICATION.RANGED_VALUE_MAX]) - ([COMPLICATION.RANGED_VALUE_MIN]))) * (300))" />
<Stroke color="#66000000" cap="ROUND" thickness="10" />
</Arc>
</PartDraw>
</Group>
<Group name="ranged_value_ring" x="0" y="0" width="60" height="60" alpha="255">
<Variant mode="AMBIENT" target="alpha" value="0" />
<PartDraw x="0" y="0" height="60" width="60">
<Arc direction="CLOCKWISE" startAngle="-150" endAngle="150" centerX="30" centerY="30" width="50" height="50">
<Stroke color="[CONFIGURATION.themeColor.0]" cap="ROUND" thickness="10" />
</Arc>
</PartDraw>
<PartDraw x="0" y="0" height="60" width="60">
<Arc direction="CLOCKWISE" startAngle="-150" endAngle="150" centerX="30" centerY="30" width="50" height="50">
<Transform target="endAngle" value="-150 + (((clamp(([COMPLICATION.RANGED_VALUE_VALUE]), ([COMPLICATION.RANGED_VALUE_MIN]), ([COMPLICATION.RANGED_VALUE_MAX])) - ([COMPLICATION.RANGED_VALUE_MIN])) / (([COMPLICATION.RANGED_VALUE_MAX]) - ([COMPLICATION.RANGED_VALUE_MIN]))) * (300))" />
<Stroke color="#66000000" cap="ROUND" thickness="10" />
</Arc>
</PartDraw>
</Group>
<Condition>
<!--
Depending on which combination of Icon, Text and Title is present in
the complication will be rendered differently.
-->
<Expressions>
<!-- A Title and/or Text, with optionally an image -->
<Expression name="rangedValue_maybeImage_textAndOrTitle">
<![CDATA[[COMPLICATION.TEXT] != null || [COMPLICATION.TITLE] != null]]>
</Expression>
<!-- An Image present, with no Text or Title -->
<Expression name="rangedValue_image_noTextNorTitle">
<![CDATA[[COMPLICATION.TEXT] == null && [COMPLICATION.TITLE] == null && [COMPLICATION.MONOCHROMATIC_IMAGE] != null]]>
</Expression>
</Expressions>
<Compare expression="rangedValue_maybeImage_textAndOrTitle">
<Condition>
<Expressions>
<Expression name="monochromatic_ambientImage">
<![CDATA[[COMPLICATION.MONOCHROMATIC_IMAGE] != null && [COMPLICATION.MONOCHROMATIC_IMAGE_AMBIENT] != null]]>
</Expression>
<Expression name="monochromatic_noAmbientImage">
<![CDATA[[COMPLICATION.MONOCHROMATIC_IMAGE] != null && [COMPLICATION.MONOCHROMATIC_IMAGE_AMBIENT] == null]]>
</Expression>
</Expressions>
<!--
Where the complication has specified an image specifically
for ambient mode, use that, with tinting applied.
-->
<Compare expression="monochromatic_ambientImage">
<PartImage x="21" y="44" width="18" height="18" tintColor="#66000000" alpha="0">
<Variant mode="AMBIENT" target="alpha" value="255" />
<Image resource="[COMPLICATION.MONOCHROMATIC_IMAGE_AMBIENT]" />
</PartImage>
<PartImage x="21" y="44" width="18" height="18" tintColor="#66000000" alpha="255">
<Variant mode="AMBIENT" target="alpha" value="0" />
<Image resource="[COMPLICATION.MONOCHROMATIC_IMAGE]" />
</PartImage>
</Compare>
<!--
Where the complication hasn't specified an image specifically
for ambient mode, use the normal image, with tinting applied.
-->
<Compare expression="monochromatic_noAmbientImage">
<PartImage x="21" y="44" width="18" height="18" tintColor="#66000000" alpha="0">
<Variant mode="AMBIENT" target="alpha" value="255" />
<Image resource="[COMPLICATION.MONOCHROMATIC_IMAGE]" />
</PartImage>
<PartImage x="21" y="44" width="18" height="18" tintColor="#66000000" alpha="255">
<Variant mode="AMBIENT" target="alpha" value="0" />
<Image resource="[COMPLICATION.MONOCHROMATIC_IMAGE]" />
</PartImage>
</Compare>
</Condition>
<Condition>
<Expressions>
<Expression name="monochromatic_both_labels">
<![CDATA[([COMPLICATION.TEXT] != null && [COMPLICATION.TITLE] != null)]]>
</Expression>
</Expressions>
<!--
Both Title and Text are present, show title above text.
-->
<Compare expression="monochromatic_both_labels">
<PartText x="0" y="32" width="60" height="20" alpha="0">
<Variant mode="AMBIENT" target="alpha" value="255" />
<Text align="CENTER" ellipsis="TRUE">
<Font family="SYNC_TO_DEVICE" size="10" weight="NORMAL" slant="NORMAL" color="#66000000">
<Template>%s<Parameter expression="[COMPLICATION.TITLE]"/>
</Template>
</Font>
</Text>
</PartText>
<PartText x="0" y="20" width="60" height="20" alpha="0">
<Variant mode="AMBIENT" target="alpha" value="255" />
<Text align="CENTER" ellipsis="TRUE">
<Font family="SYNC_TO_DEVICE" size="16" weight="NORMAL" slant="NORMAL" color="#66000000">
<Template>%s<Parameter expression="[COMPLICATION.TEXT]"/>
</Template>
</Font>
</Text>
</PartText>
<PartText x="0" y="32" width="60" height="20">
<Variant mode="AMBIENT" target="alpha" value="0" />
<Text align="CENTER" ellipsis="TRUE">
<Font family="SYNC_TO_DEVICE" size="10" weight="NORMAL" slant="NORMAL" color="#66000000">
<Template>%s<Parameter expression="[COMPLICATION.TITLE]"/>
</Template>
</Font>
</Text>
</PartText>
<PartText x="0" y="20" width="60" height="20">
<Variant mode="AMBIENT" target="alpha" value="0" />
<Text align="CENTER" ellipsis="TRUE">
<Font family="SYNC_TO_DEVICE" size="16" weight="NORMAL" slant="NORMAL" color="#66000000">
<Template>%s<Parameter expression="[COMPLICATION.TEXT]"/>
</Template>
</Font>
</Text>
</PartText>
</Compare>
<!--
Only one of Title or Text is present, show this is slightly
larger than when both are displayed.
-->
<Default>
<PartText x="0" y="0" width="60" height="60" alpha="0">
<Variant mode="AMBIENT" target="alpha" value="255" />
<Text align="CENTER" ellipsis="TRUE">
<Font family="SYNC_TO_DEVICE" size="14" weight="NORMAL" slant="NORMAL" color="#66000000">
<!-- In this example, prefer Text over Title -->
<Template>%s<Parameter expression="[COMPLICATION.TEXT] != null ? [COMPLICATION.TEXT] : [COMPLICATION.TITLE]"/>
</Template>
</Font>
</Text>
</PartText>
<PartText x="0" y="0" width="60" height="60">
<Variant mode="AMBIENT" target="alpha" value="0" />
<Text align="CENTER" ellipsis="TRUE">
<Font family="SYNC_TO_DEVICE" size="14" weight="NORMAL" slant="NORMAL" color="#66000000">
<!-- In this example, prefer Text over Title -->
<Template>%s<Parameter expression="[COMPLICATION.TEXT] != null ? [COMPLICATION.TEXT] : [COMPLICATION.TITLE]"/></Template>
</Font>
</Text>
</PartText>
</Default>
</Condition>
</Compare>
<!--
Image is present, but no text or title, so show the image centrally
in the complication, larger then when the text or title is available
-->
<Compare expression="rangedValue_image_noTextNorTitle">
<Condition>
<Expressions>
<Expression name="monochromatic_ambientImage">
<![CDATA[[COMPLICATION.MONOCHROMATIC_IMAGE] != null && [COMPLICATION.MONOCHROMATIC_IMAGE_AMBIENT] != null]]>
</Expression>
<Expression name="monochromatic_noAmbientImage">
<![CDATA[[COMPLICATION.MONOCHROMATIC_IMAGE] != null && [COMPLICATION.MONOCHROMATIC_IMAGE_AMBIENT] == null]]>
</Expression>
</Expressions>
<Compare expression="monochromatic_ambientImage">
<PartImage x="30" y="30" width="25" height="25" tintColor="#66000000" alpha="0">
<Variant mode="AMBIENT" target="alpha" value="255" />
<Image resource="[COMPLICATION.MONOCHROMATIC_IMAGE_AMBIENT]" />
</PartImage>
<PartImage x="30" y="30" width="25" height="25" tintColor="#66000000">
<Variant mode="AMBIENT" target="alpha" value="0" />
<Image resource="[COMPLICATION.MONOCHROMATIC_IMAGE]" />
</PartImage>
</Compare>
<Compare expression="monochromatic_noAmbientImage">
<PartImage x="30" y="30" width="25" height="25" tintColor="#66000000" alpha="0">
<Variant mode="AMBIENT" target="alpha" value="255" />
<Image resource="[COMPLICATION.MONOCHROMATIC_IMAGE]" />
</PartImage>
<PartImage x="30" y="30" width="25" height="25" tintColor="#66000000">
<Variant mode="AMBIENT" target="alpha" value="0" />
<Image resource="[COMPLICATION.MONOCHROMATIC_IMAGE]" />
</PartImage>
</Compare>
</Condition>
</Compare>
</Condition>
</Complication>
</ComplicationSlot>
<ComplicationSlot
x="388" y="195"
width="60" height="60"
slotId="1"
name="right_complication" displayName="Right"
supportedTypes="RANGED_VALUE">
<!--
There is no guarantee that the primaryProvider component name is
available on the device. Therefore defaultSystemProvider is mandatory in
DefaultSystemProvider, to provide a fallback.
System providers are listed here: https://developer.android.com/reference/android/support/wearable/complications/SystemProviders.html
-->
<DefaultProviderPolicy
primaryProvider="com.fitbit.FitbitMobile/com.fitbit.complications.calories.CaloriesComplicationDataSourceService"
primaryProviderType="RANGED_VALUE"
defaultSystemProvider="STEP_COUNT"
defaultSystemProviderType="RANGED_VALUE"
/>
<!--
Several different bounding shapes are supported in WFF, see:
https://developer.android.com/training/wearables/wff/complication/bounding
This example= only demonstrates a round complication.
-->
<BoundingOval x="0" y="0" width="60" height="60" outlinePadding="2" />
<!--
Basic example of a Ranged Value complication.
Ranged Value complications support optional data fields:
- Text
- Title
- Monochromatic Image
(Note that although AndroidX RangedValueComplicationData supports
containing SmallImage, Watch Face format does not expose these, so you
should use Monochromatic Image for icons.)
At least one of these must be set. This condition and set of expressions
evaluates which combination has been provided by the data source and
renders accordingly.
-->
<Complication type="RANGED_VALUE">
<Group name="ranged_value_ring_ambient" x="0" y="0" width="60" height="60" alpha="0">
<Variant mode="AMBIENT" target="alpha" value="255" />
<PartDraw x="0" y="0" height="60" width="60">
<Arc direction="CLOCKWISE" startAngle="-150" endAngle="150" centerX="30" centerY="30" width="50" height="50">
<Stroke color="[CONFIGURATION.themeColor.3]" cap="ROUND" thickness="10" />
</Arc>
</PartDraw>
<PartDraw x="0" y="0" height="60" width="60" >
<Arc direction="CLOCKWISE" startAngle="-150" endAngle="150" centerX="30" centerY="30" width="50" height="50">
<Transform target="endAngle" value="-150 + (((clamp(([COMPLICATION.RANGED_VALUE_VALUE]), ([COMPLICATION.RANGED_VALUE_MIN]), ([COMPLICATION.RANGED_VALUE_MAX])) - ([COMPLICATION.RANGED_VALUE_MIN])) / (([COMPLICATION.RANGED_VALUE_MAX]) - ([COMPLICATION.RANGED_VALUE_MIN]))) * (300))" />
<Stroke color="#66000000" cap="ROUND" thickness="10" />
</Arc>
</PartDraw>
</Group>
<Group name="ranged_value_ring" x="0" y="0" width="60" height="60" alpha="255">
<Variant mode="AMBIENT" target="alpha" value="0" />
<PartDraw x="0" y="0" height="60" width="60">
<Arc direction="CLOCKWISE" startAngle="-150" endAngle="150" centerX="30" centerY="30" width="50" height="50">
<Stroke color="[CONFIGURATION.themeColor.0]" cap="ROUND" thickness="10" />
</Arc>
</PartDraw>
<PartDraw x="0" y="0" height="60" width="60">
<Arc direction="CLOCKWISE" startAngle="-150" endAngle="150" centerX="30" centerY="30" width="50" height="50">
<Transform target="endAngle" value="-150 + (((clamp(([COMPLICATION.RANGED_VALUE_VALUE]), ([COMPLICATION.RANGED_VALUE_MIN]), ([COMPLICATION.RANGED_VALUE_MAX])) - ([COMPLICATION.RANGED_VALUE_MIN])) / (([COMPLICATION.RANGED_VALUE_MAX]) - ([COMPLICATION.RANGED_VALUE_MIN]))) * (300))" />
<Stroke color="#66000000" cap="ROUND" thickness="10" />
</Arc>
</PartDraw>
</Group>
<Condition>
<!--
Depending on which combination of Icon, Text and Title is present in
the complication will be rendered differently.
-->
<Expressions>
<!-- A Title and/or Text, with optionally an image -->
<Expression name="rangedValue_maybeImage_textAndOrTitle">
<![CDATA[[COMPLICATION.TEXT] != null || [COMPLICATION.TITLE] != null]]>
</Expression>
<!-- An Image present, with no Text or Title -->
<Expression name="rangedValue_image_noTextNorTitle">
<![CDATA[[COMPLICATION.TEXT] == null && [COMPLICATION.TITLE] == null && [COMPLICATION.MONOCHROMATIC_IMAGE] != null]]>
</Expression>
</Expressions>
<Compare expression="rangedValue_maybeImage_textAndOrTitle">
<Condition>
<Expressions>
<Expression name="monochromatic_ambientImage">
<![CDATA[[COMPLICATION.MONOCHROMATIC_IMAGE] != null && [COMPLICATION.MONOCHROMATIC_IMAGE_AMBIENT] != null]]>
</Expression>
<Expression name="monochromatic_noAmbientImage">
<![CDATA[[COMPLICATION.MONOCHROMATIC_IMAGE] != null && [COMPLICATION.MONOCHROMATIC_IMAGE_AMBIENT] == null]]>
</Expression>
</Expressions>
<!--
Where the complication has specified an image specifically
for ambient mode, use that, with tinting applied.
-->
<Compare expression="monochromatic_ambientImage">
<PartImage x="21" y="44" width="18" height="18" tintColor="#66000000" alpha="0">
<Variant mode="AMBIENT" target="alpha" value="255" />
<Image resource="[COMPLICATION.MONOCHROMATIC_IMAGE_AMBIENT]" />
</PartImage>
<PartImage x="21" y="44" width="18" height="18" tintColor="#66000000" alpha="255">
<Variant mode="AMBIENT" target="alpha" value="0" />
<Image resource="[COMPLICATION.MONOCHROMATIC_IMAGE]" />
</PartImage>
</Compare>
<!--
Where the complication hasn't specified an image specifically
for ambient mode, use the normal image, with tinting applied.
-->
<Compare expression="monochromatic_noAmbientImage">
<PartImage x="21" y="44" width="18" height="18" tintColor="#66000000" alpha="0">
<Variant mode="AMBIENT" target="alpha" value="255" />
<Image resource="[COMPLICATION.MONOCHROMATIC_IMAGE]" />
</PartImage>
<PartImage x="21" y="44" width="18" height="18" tintColor="#66000000" alpha="255">
<Variant mode="AMBIENT" target="alpha" value="0" />
<Image resource="[COMPLICATION.MONOCHROMATIC_IMAGE]" />
</PartImage>
</Compare>
</Condition>
<Condition>
<Expressions>
<Expression name="monochromatic_both_labels">
<![CDATA[([COMPLICATION.TEXT] != null && [COMPLICATION.TITLE] != null)]]>
</Expression>
</Expressions>
<!--
Both Title and Text are present, show title above text.
-->
<Compare expression="monochromatic_both_labels">
<PartText x="0" y="32" width="60" height="20" alpha="0">
<Variant mode="AMBIENT" target="alpha" value="255" />
<Text align="CENTER" ellipsis="TRUE">
<Font family="SYNC_TO_DEVICE" size="10" weight="NORMAL" slant="NORMAL" color="#66000000">
<Template>%s<Parameter expression="[COMPLICATION.TITLE]"/>
</Template>
</Font>
</Text>
</PartText>
<PartText x="0" y="20" width="60" height="20" alpha="0">
<Variant mode="AMBIENT" target="alpha" value="255" />
<Text align="CENTER" ellipsis="TRUE">
<Font family="SYNC_TO_DEVICE" size="16" weight="NORMAL" slant="NORMAL" color="#66000000">
<Template>%s<Parameter expression="[COMPLICATION.TEXT]"/>
</Template>
</Font>
</Text>
</PartText>
<PartText x="0" y="32" width="60" height="20">
<Variant mode="AMBIENT" target="alpha" value="0" />
<Text align="CENTER" ellipsis="TRUE">
<Font family="SYNC_TO_DEVICE" size="10" weight="NORMAL" slant="NORMAL" color="#66000000">
<Template>%s<Parameter expression="[COMPLICATION.TITLE]"/>
</Template>
</Font>
</Text>
</PartText>
<PartText x="0" y="20" width="60" height="20">
<Variant mode="AMBIENT" target="alpha" value="0" />
<Text align="CENTER" ellipsis="TRUE">
<Font family="SYNC_TO_DEVICE" size="16" weight="NORMAL" slant="NORMAL" color="#66000000">
<Template>%s<Parameter expression="[COMPLICATION.TEXT]"/>
</Template>
</Font>
</Text>
</PartText>
</Compare>
<!--
Only one of Title or Text is present, show this is slightly
larger than when both are displayed.
-->
<Default>
<PartText x="0" y="0" width="60" height="60" alpha="0">
<Variant mode="AMBIENT" target="alpha" value="255" />
<Text align="CENTER" ellipsis="TRUE">
<Font family="SYNC_TO_DEVICE" size="14" weight="NORMAL" slant="NORMAL" color="#66000000">
<!-- In this example, prefer Text over Title -->
<Template>%s<Parameter expression="[COMPLICATION.TEXT] != null ? [COMPLICATION.TEXT] : [COMPLICATION.TITLE]"/>
</Template>
</Font>
</Text>
</PartText>
<PartText x="0" y="0" width="60" height="60">
<Variant mode="AMBIENT" target="alpha" value="0" />
<Text align="CENTER" ellipsis="TRUE">
<Font family="SYNC_TO_DEVICE" size="14" weight="NORMAL" slant="NORMAL" color="#66000000">
<!-- In this example, prefer Text over Title -->
<Template>%s<Parameter expression="[COMPLICATION.TEXT] != null ? [COMPLICATION.TEXT] : [COMPLICATION.TITLE]"/></Template>
</Font>
</Text>
</PartText>
</Default>
</Condition>
</Compare>
<!--
Image is present, but no text or title, so show the image centrally
in the complication, larger then when the text or title is available
-->
<Compare expression="rangedValue_image_noTextNorTitle">
<Condition>
<Expressions>
<Expression name="monochromatic_ambientImage">
<![CDATA[[COMPLICATION.MONOCHROMATIC_IMAGE] != null && [COMPLICATION.MONOCHROMATIC_IMAGE_AMBIENT] != null]]>
</Expression>
<Expression name="monochromatic_noAmbientImage">
<![CDATA[[COMPLICATION.MONOCHROMATIC_IMAGE] != null && [COMPLICATION.MONOCHROMATIC_IMAGE_AMBIENT] == null]]>
</Expression>
</Expressions>
<Compare expression="monochromatic_ambientImage">
<PartImage x="30" y="30" width="25" height="25" tintColor="#66000000" alpha="0">
<Variant mode="AMBIENT" target="alpha" value="255" />
<Image resource="[COMPLICATION.MONOCHROMATIC_IMAGE_AMBIENT]" />
</PartImage>
<PartImage x="30" y="30" width="25" height="25" tintColor="#66000000">
<Variant mode="AMBIENT" target="alpha" value="0" />
<Image resource="[COMPLICATION.MONOCHROMATIC_IMAGE]" />
</PartImage>
</Compare>
<Compare expression="monochromatic_noAmbientImage">
<PartImage x="30" y="30" width="25" height="25" tintColor="#66000000" alpha="0">
<Variant mode="AMBIENT" target="alpha" value="255" />
<Image resource="[COMPLICATION.MONOCHROMATIC_IMAGE]" />
</PartImage>
<PartImage x="30" y="30" width="25" height="25" tintColor="#66000000">
<Variant mode="AMBIENT" target="alpha" value="0" />
<Image resource="[COMPLICATION.MONOCHROMATIC_IMAGE]" />
</PartImage>
</Compare>
</Condition>
</Compare>
</Condition>
</Complication>
</ComplicationSlot>
</Scene>
</WatchFace>

View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2024 Google LLC
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<resources>
<string name="watch_face_name">Austen</string>
</resources>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<WatchFaceInfo>
<Preview value="@drawable/preview" />
<MultipleInstancesAllowed value="false" />
<Editable value="true" />
</WatchFaceInfo>