mirror of
				https://github.com/house-of-abbey/GarminHomeAssistant.git
				synced 2025-11-04 00:48:14 +00:00 
			
		
		
		
	GPS and current activity in background service
This commit is contained in:
		@@ -25,7 +25,8 @@
 | 
				
			|||||||
    Use "Monkey C: Edit Application" from the Visual Studio Code command palette
 | 
					    Use "Monkey C: Edit Application" from the Visual Studio Code command palette
 | 
				
			||||||
    to update the application attributes.
 | 
					    to update the application attributes.
 | 
				
			||||||
  -->
 | 
					  -->
 | 
				
			||||||
  <iq:application id="4901cdfb-b4a2-4f33-96c7-f5be5992809e" type="widget" name="@Strings.AppName" entry="HomeAssistantApp" launcherIcon="@Drawables.LauncherIcon" minApiLevel="3.1.0">
 | 
					  <iq:application id="4901cdfb-b4a2-4f33-96c7-f5be5992809e" type="widget" name="@Strings.AppName"
 | 
				
			||||||
 | 
					    entry="HomeAssistantApp" launcherIcon="@Drawables.LauncherIcon" minApiLevel="3.1.0">
 | 
				
			||||||
    <!--
 | 
					    <!--
 | 
				
			||||||
      Use the following from the Visual Studio Code comand palette to edit
 | 
					      Use the following from the Visual Studio Code comand palette to edit
 | 
				
			||||||
      the build targets:
 | 
					      the build targets:
 | 
				
			||||||
@@ -34,115 +35,116 @@
 | 
				
			|||||||
      "Monkey C: Edit Products" - Lets you add or remove any product
 | 
					      "Monkey C: Edit Products" - Lets you add or remove any product
 | 
				
			||||||
    -->
 | 
					    -->
 | 
				
			||||||
    <iq:products>
 | 
					    <iq:products>
 | 
				
			||||||
      <iq:product id="approachs7042mm"/>
 | 
					      <iq:product id="approachs7042mm" />
 | 
				
			||||||
      <iq:product id="approachs7047mm"/>
 | 
					      <iq:product id="approachs7047mm" />
 | 
				
			||||||
      <iq:product id="d2air"/>
 | 
					      <iq:product id="d2air" />
 | 
				
			||||||
      <iq:product id="d2airx10"/>
 | 
					      <iq:product id="d2airx10" />
 | 
				
			||||||
      <iq:product id="d2delta"/>
 | 
					      <iq:product id="d2delta" />
 | 
				
			||||||
      <iq:product id="d2deltapx"/>
 | 
					      <iq:product id="d2deltapx" />
 | 
				
			||||||
      <iq:product id="d2deltas"/>
 | 
					      <iq:product id="d2deltas" />
 | 
				
			||||||
      <iq:product id="d2mach1"/>
 | 
					      <iq:product id="d2mach1" />
 | 
				
			||||||
      <iq:product id="descentg1"/>
 | 
					      <iq:product id="descentg1" />
 | 
				
			||||||
      <iq:product id="descentmk2"/>
 | 
					      <iq:product id="descentmk2" />
 | 
				
			||||||
      <iq:product id="descentmk2s"/>
 | 
					      <iq:product id="descentmk2s" />
 | 
				
			||||||
      <iq:product id="edge1030"/>
 | 
					      <iq:product id="edge1030" />
 | 
				
			||||||
      <iq:product id="edge1030bontrager"/>
 | 
					      <iq:product id="edge1030bontrager" />
 | 
				
			||||||
      <iq:product id="edge1030plus"/>
 | 
					      <iq:product id="edge1030plus" />
 | 
				
			||||||
      <iq:product id="edge1040"/>
 | 
					      <iq:product id="edge1040" />
 | 
				
			||||||
      <iq:product id="edge520plus"/>
 | 
					      <iq:product id="edge520plus" />
 | 
				
			||||||
      <iq:product id="edge530"/>
 | 
					      <iq:product id="edge530" />
 | 
				
			||||||
      <iq:product id="edge820"/>
 | 
					      <iq:product id="edge820" />
 | 
				
			||||||
      <iq:product id="edge830"/>
 | 
					      <iq:product id="edge830" />
 | 
				
			||||||
      <iq:product id="edgeexplore"/>
 | 
					      <iq:product id="edgeexplore" />
 | 
				
			||||||
      <iq:product id="edgeexplore2"/>
 | 
					      <iq:product id="edgeexplore2" />
 | 
				
			||||||
      <iq:product id="enduro"/>
 | 
					      <iq:product id="enduro" />
 | 
				
			||||||
      <iq:product id="epix2"/>
 | 
					      <iq:product id="epix2" />
 | 
				
			||||||
      <iq:product id="epix2pro42mm"/>
 | 
					      <iq:product id="epix2pro42mm" />
 | 
				
			||||||
      <iq:product id="epix2pro47mm"/>
 | 
					      <iq:product id="epix2pro47mm" />
 | 
				
			||||||
      <iq:product id="epix2pro51mm"/>
 | 
					      <iq:product id="epix2pro51mm" />
 | 
				
			||||||
      <iq:product id="fenix5"/>
 | 
					      <iq:product id="fenix5" />
 | 
				
			||||||
      <iq:product id="fenix5plus"/>
 | 
					      <iq:product id="fenix5plus" />
 | 
				
			||||||
      <iq:product id="fenix5s"/>
 | 
					      <iq:product id="fenix5s" />
 | 
				
			||||||
      <iq:product id="fenix5splus"/>
 | 
					      <iq:product id="fenix5splus" />
 | 
				
			||||||
      <iq:product id="fenix5x"/>
 | 
					      <iq:product id="fenix5x" />
 | 
				
			||||||
      <iq:product id="fenix5xplus"/>
 | 
					      <iq:product id="fenix5xplus" />
 | 
				
			||||||
      <iq:product id="fenix6"/>
 | 
					      <iq:product id="fenix6" />
 | 
				
			||||||
      <iq:product id="fenix6pro"/>
 | 
					      <iq:product id="fenix6pro" />
 | 
				
			||||||
      <iq:product id="fenix6s"/>
 | 
					      <iq:product id="fenix6s" />
 | 
				
			||||||
      <iq:product id="fenix6spro"/>
 | 
					      <iq:product id="fenix6spro" />
 | 
				
			||||||
      <iq:product id="fenix6xpro"/>
 | 
					      <iq:product id="fenix6xpro" />
 | 
				
			||||||
      <iq:product id="fenix7"/>
 | 
					      <iq:product id="fenix7" />
 | 
				
			||||||
      <iq:product id="fenix7pro"/>
 | 
					      <iq:product id="fenix7pro" />
 | 
				
			||||||
      <iq:product id="fenix7pronowifi"/>
 | 
					      <iq:product id="fenix7pronowifi" />
 | 
				
			||||||
      <iq:product id="fenix7s"/>
 | 
					      <iq:product id="fenix7s" />
 | 
				
			||||||
      <iq:product id="fenix7spro"/>
 | 
					      <iq:product id="fenix7spro" />
 | 
				
			||||||
      <iq:product id="fenix7x"/>
 | 
					      <iq:product id="fenix7x" />
 | 
				
			||||||
      <iq:product id="fenix7xpro"/>
 | 
					      <iq:product id="fenix7xpro" />
 | 
				
			||||||
      <iq:product id="fenix7xpronowifi"/>
 | 
					      <iq:product id="fenix7xpronowifi" />
 | 
				
			||||||
      <iq:product id="fenixchronos"/>
 | 
					      <iq:product id="fenixchronos" />
 | 
				
			||||||
      <iq:product id="fr245"/>
 | 
					      <iq:product id="fr245" />
 | 
				
			||||||
      <iq:product id="fr245m"/>
 | 
					      <iq:product id="fr245m" />
 | 
				
			||||||
      <iq:product id="fr255"/>
 | 
					      <iq:product id="fr255" />
 | 
				
			||||||
      <iq:product id="fr255m"/>
 | 
					      <iq:product id="fr255m" />
 | 
				
			||||||
      <iq:product id="fr255s"/>
 | 
					      <iq:product id="fr255s" />
 | 
				
			||||||
      <iq:product id="fr255sm"/>
 | 
					      <iq:product id="fr255sm" />
 | 
				
			||||||
      <iq:product id="fr265"/>
 | 
					      <iq:product id="fr265" />
 | 
				
			||||||
      <iq:product id="fr265s"/>
 | 
					      <iq:product id="fr265s" />
 | 
				
			||||||
      <iq:product id="fr55"/>
 | 
					      <iq:product id="fr55" />
 | 
				
			||||||
      <iq:product id="fr645"/>
 | 
					      <iq:product id="fr645" />
 | 
				
			||||||
      <iq:product id="fr645m"/>
 | 
					      <iq:product id="fr645m" />
 | 
				
			||||||
      <iq:product id="fr745"/>
 | 
					      <iq:product id="fr745" />
 | 
				
			||||||
      <iq:product id="fr935"/>
 | 
					      <iq:product id="fr935" />
 | 
				
			||||||
      <iq:product id="fr945"/>
 | 
					      <iq:product id="fr945" />
 | 
				
			||||||
      <iq:product id="fr945lte"/>
 | 
					      <iq:product id="fr945lte" />
 | 
				
			||||||
      <iq:product id="fr955"/>
 | 
					      <iq:product id="fr955" />
 | 
				
			||||||
      <iq:product id="fr965"/>
 | 
					      <iq:product id="fr965" />
 | 
				
			||||||
      <iq:product id="gpsmap67"/>
 | 
					      <iq:product id="gpsmap67" />
 | 
				
			||||||
      <iq:product id="instinct2"/>
 | 
					      <iq:product id="instinct2" />
 | 
				
			||||||
      <iq:product id="instinct2s"/>
 | 
					      <iq:product id="instinct2s" />
 | 
				
			||||||
      <iq:product id="instinct2x"/>
 | 
					      <iq:product id="instinct2x" />
 | 
				
			||||||
      <iq:product id="instinctcrossover"/>
 | 
					      <iq:product id="instinctcrossover" />
 | 
				
			||||||
      <iq:product id="legacyherocaptainmarvel"/>
 | 
					      <iq:product id="legacyherocaptainmarvel" />
 | 
				
			||||||
      <iq:product id="legacyherofirstavenger"/>
 | 
					      <iq:product id="legacyherofirstavenger" />
 | 
				
			||||||
      <iq:product id="legacysagadarthvader"/>
 | 
					      <iq:product id="legacysagadarthvader" />
 | 
				
			||||||
      <iq:product id="legacysagarey"/>
 | 
					      <iq:product id="legacysagarey" />
 | 
				
			||||||
      <iq:product id="marq2"/>
 | 
					      <iq:product id="marq2" />
 | 
				
			||||||
      <iq:product id="marq2aviator"/>
 | 
					      <iq:product id="marq2aviator" />
 | 
				
			||||||
      <iq:product id="marqadventurer"/>
 | 
					      <iq:product id="marqadventurer" />
 | 
				
			||||||
      <iq:product id="marqathlete"/>
 | 
					      <iq:product id="marqathlete" />
 | 
				
			||||||
      <iq:product id="marqaviator"/>
 | 
					      <iq:product id="marqaviator" />
 | 
				
			||||||
      <iq:product id="marqcaptain"/>
 | 
					      <iq:product id="marqcaptain" />
 | 
				
			||||||
      <iq:product id="marqcommander"/>
 | 
					      <iq:product id="marqcommander" />
 | 
				
			||||||
      <iq:product id="marqdriver"/>
 | 
					      <iq:product id="marqdriver" />
 | 
				
			||||||
      <iq:product id="marqexpedition"/>
 | 
					      <iq:product id="marqexpedition" />
 | 
				
			||||||
      <iq:product id="marqgolfer"/>
 | 
					      <iq:product id="marqgolfer" />
 | 
				
			||||||
      <iq:product id="montana7xx"/>
 | 
					      <iq:product id="montana7xx" />
 | 
				
			||||||
      <iq:product id="venu"/>
 | 
					      <iq:product id="venu" />
 | 
				
			||||||
      <iq:product id="venu2"/>
 | 
					      <iq:product id="venu2" />
 | 
				
			||||||
      <iq:product id="venu2plus"/>
 | 
					      <iq:product id="venu2plus" />
 | 
				
			||||||
      <iq:product id="venu2s"/>
 | 
					      <iq:product id="venu2s" />
 | 
				
			||||||
      <iq:product id="venu3"/>
 | 
					      <iq:product id="venu3" />
 | 
				
			||||||
      <iq:product id="venu3s"/>
 | 
					      <iq:product id="venu3s" />
 | 
				
			||||||
      <iq:product id="venud"/>
 | 
					      <iq:product id="venud" />
 | 
				
			||||||
      <iq:product id="venusq"/>
 | 
					      <iq:product id="venusq" />
 | 
				
			||||||
      <iq:product id="venusq2"/>
 | 
					      <iq:product id="venusq2" />
 | 
				
			||||||
      <iq:product id="venusq2m"/>
 | 
					      <iq:product id="venusq2m" />
 | 
				
			||||||
      <iq:product id="venusqm"/>
 | 
					      <iq:product id="venusqm" />
 | 
				
			||||||
      <iq:product id="vivoactive3"/>
 | 
					      <iq:product id="vivoactive3" />
 | 
				
			||||||
      <iq:product id="vivoactive3m"/>
 | 
					      <iq:product id="vivoactive3m" />
 | 
				
			||||||
      <iq:product id="vivoactive3mlte"/>
 | 
					      <iq:product id="vivoactive3mlte" />
 | 
				
			||||||
      <iq:product id="vivoactive4"/>
 | 
					      <iq:product id="vivoactive4" />
 | 
				
			||||||
      <iq:product id="vivoactive4s"/>
 | 
					      <iq:product id="vivoactive4s" />
 | 
				
			||||||
      <iq:product id="vivoactive5"/>
 | 
					      <iq:product id="vivoactive5" />
 | 
				
			||||||
    </iq:products>
 | 
					    </iq:products>
 | 
				
			||||||
    <!--
 | 
					    <!--
 | 
				
			||||||
      Use "Monkey C: Edit Permissions" from the Visual Studio Code command
 | 
					      Use "Monkey C: Edit Permissions" from the Visual Studio Code command
 | 
				
			||||||
      palette to update permissions.
 | 
					      palette to update permissions.
 | 
				
			||||||
    -->
 | 
					    -->
 | 
				
			||||||
    <iq:permissions>
 | 
					    <iq:permissions>
 | 
				
			||||||
      <iq:uses-permission id="Background"/>
 | 
					      <iq:uses-permission id="Background" />
 | 
				
			||||||
      <iq:uses-permission id="BluetoothLowEnergy"/>
 | 
					      <iq:uses-permission id="BluetoothLowEnergy" />
 | 
				
			||||||
      <iq:uses-permission id="Communications"/>
 | 
					      <iq:uses-permission id="Communications" />
 | 
				
			||||||
 | 
					      <iq:uses-permission id="Positioning" />
 | 
				
			||||||
    </iq:permissions>
 | 
					    </iq:permissions>
 | 
				
			||||||
    <!--
 | 
					    <!--
 | 
				
			||||||
      Use "Monkey C: Edit Languages" from the Visual Studio Code command
 | 
					      Use "Monkey C: Edit Languages" from the Visual Studio Code command
 | 
				
			||||||
@@ -190,6 +192,6 @@
 | 
				
			|||||||
      Use "Monkey C: Configure Monkey Barrel" from the Visual Studio Code
 | 
					      Use "Monkey C: Configure Monkey Barrel" from the Visual Studio Code
 | 
				
			||||||
      command palette to edit the included barrels.
 | 
					      command palette to edit the included barrels.
 | 
				
			||||||
    -->
 | 
					    -->
 | 
				
			||||||
    <iq:barrels/>
 | 
					    <iq:barrels />
 | 
				
			||||||
  </iq:application>
 | 
					  </iq:application>
 | 
				
			||||||
</iq:manifest>
 | 
					</iq:manifest>
 | 
				
			||||||
							
								
								
									
										217
									
								
								manifest.xml
									
									
									
									
									
								
							
							
						
						
									
										217
									
								
								manifest.xml
									
									
									
									
									
								
							@@ -28,9 +28,11 @@
 | 
				
			|||||||
    Testing in VSCode requires monkey.jungle, so for convenience, swap between
 | 
					    Testing in VSCode requires monkey.jungle, so for convenience, swap between
 | 
				
			||||||
    watch-app and widget by changing which of the next two lines are commented out
 | 
					    watch-app and widget by changing which of the next two lines are commented out
 | 
				
			||||||
  -->
 | 
					  -->
 | 
				
			||||||
  <iq:application id="98c36259-498a-4458-9cef-74a273ad2bc3" type="watch-app" name="@Strings.AppName" entry="HomeAssistantApp" launcherIcon="@Drawables.LauncherIcon" minApiLevel="3.1.0">
 | 
					  <iq:application id="98c36259-498a-4458-9cef-74a273ad2bc3" type="watch-app" name="@Strings.AppName"
 | 
				
			||||||
  <!-- 
 | 
					    entry="HomeAssistantApp" launcherIcon="@Drawables.LauncherIcon" minApiLevel="3.1.0">
 | 
				
			||||||
  <iq:application id="4901cdfb-b4a2-4f33-96c7-f5be5992809e" type="widget" name="@Strings.AppName" entry="HomeAssistantApp" launcherIcon="@Drawables.LauncherIcon" minApiLevel="3.1.0">
 | 
					    <!-- 
 | 
				
			||||||
 | 
					  <iq:application id="4901cdfb-b4a2-4f33-96c7-f5be5992809e" type="widget" name="@Strings.AppName"
 | 
				
			||||||
 | 
					    entry="HomeAssistantApp" launcherIcon="@Drawables.LauncherIcon" minApiLevel="3.1.0">
 | 
				
			||||||
  -->
 | 
					  -->
 | 
				
			||||||
    <!--
 | 
					    <!--
 | 
				
			||||||
      Use the following from the Visual Studio Code comand palette to edit
 | 
					      Use the following from the Visual Studio Code comand palette to edit
 | 
				
			||||||
@@ -40,115 +42,116 @@
 | 
				
			|||||||
      "Monkey C: Edit Products" - Lets you add or remove any product
 | 
					      "Monkey C: Edit Products" - Lets you add or remove any product
 | 
				
			||||||
    -->
 | 
					    -->
 | 
				
			||||||
    <iq:products>
 | 
					    <iq:products>
 | 
				
			||||||
      <iq:product id="approachs7042mm"/>
 | 
					      <iq:product id="approachs7042mm" />
 | 
				
			||||||
      <iq:product id="approachs7047mm"/>
 | 
					      <iq:product id="approachs7047mm" />
 | 
				
			||||||
      <iq:product id="d2air"/>
 | 
					      <iq:product id="d2air" />
 | 
				
			||||||
      <iq:product id="d2airx10"/>
 | 
					      <iq:product id="d2airx10" />
 | 
				
			||||||
      <iq:product id="d2delta"/>
 | 
					      <iq:product id="d2delta" />
 | 
				
			||||||
      <iq:product id="d2deltapx"/>
 | 
					      <iq:product id="d2deltapx" />
 | 
				
			||||||
      <iq:product id="d2deltas"/>
 | 
					      <iq:product id="d2deltas" />
 | 
				
			||||||
      <iq:product id="d2mach1"/>
 | 
					      <iq:product id="d2mach1" />
 | 
				
			||||||
      <iq:product id="descentg1"/>
 | 
					      <iq:product id="descentg1" />
 | 
				
			||||||
      <iq:product id="descentmk2"/>
 | 
					      <iq:product id="descentmk2" />
 | 
				
			||||||
      <iq:product id="descentmk2s"/>
 | 
					      <iq:product id="descentmk2s" />
 | 
				
			||||||
      <iq:product id="edge1030"/>
 | 
					      <iq:product id="edge1030" />
 | 
				
			||||||
      <iq:product id="edge1030bontrager"/>
 | 
					      <iq:product id="edge1030bontrager" />
 | 
				
			||||||
      <iq:product id="edge1030plus"/>
 | 
					      <iq:product id="edge1030plus" />
 | 
				
			||||||
      <iq:product id="edge1040"/>
 | 
					      <iq:product id="edge1040" />
 | 
				
			||||||
      <iq:product id="edge520plus"/>
 | 
					      <iq:product id="edge520plus" />
 | 
				
			||||||
      <iq:product id="edge530"/>
 | 
					      <iq:product id="edge530" />
 | 
				
			||||||
      <iq:product id="edge820"/>
 | 
					      <iq:product id="edge820" />
 | 
				
			||||||
      <iq:product id="edge830"/>
 | 
					      <iq:product id="edge830" />
 | 
				
			||||||
      <iq:product id="edgeexplore"/>
 | 
					      <iq:product id="edgeexplore" />
 | 
				
			||||||
      <iq:product id="edgeexplore2"/>
 | 
					      <iq:product id="edgeexplore2" />
 | 
				
			||||||
      <iq:product id="enduro"/>
 | 
					      <iq:product id="enduro" />
 | 
				
			||||||
      <iq:product id="epix2"/>
 | 
					      <iq:product id="epix2" />
 | 
				
			||||||
      <iq:product id="epix2pro42mm"/>
 | 
					      <iq:product id="epix2pro42mm" />
 | 
				
			||||||
      <iq:product id="epix2pro47mm"/>
 | 
					      <iq:product id="epix2pro47mm" />
 | 
				
			||||||
      <iq:product id="epix2pro51mm"/>
 | 
					      <iq:product id="epix2pro51mm" />
 | 
				
			||||||
      <iq:product id="fenix5"/>
 | 
					      <iq:product id="fenix5" />
 | 
				
			||||||
      <iq:product id="fenix5plus"/>
 | 
					      <iq:product id="fenix5plus" />
 | 
				
			||||||
      <iq:product id="fenix5s"/>
 | 
					      <iq:product id="fenix5s" />
 | 
				
			||||||
      <iq:product id="fenix5splus"/>
 | 
					      <iq:product id="fenix5splus" />
 | 
				
			||||||
      <iq:product id="fenix5x"/>
 | 
					      <iq:product id="fenix5x" />
 | 
				
			||||||
      <iq:product id="fenix5xplus"/>
 | 
					      <iq:product id="fenix5xplus" />
 | 
				
			||||||
      <iq:product id="fenix6"/>
 | 
					      <iq:product id="fenix6" />
 | 
				
			||||||
      <iq:product id="fenix6pro"/>
 | 
					      <iq:product id="fenix6pro" />
 | 
				
			||||||
      <iq:product id="fenix6s"/>
 | 
					      <iq:product id="fenix6s" />
 | 
				
			||||||
      <iq:product id="fenix6spro"/>
 | 
					      <iq:product id="fenix6spro" />
 | 
				
			||||||
      <iq:product id="fenix6xpro"/>
 | 
					      <iq:product id="fenix6xpro" />
 | 
				
			||||||
      <iq:product id="fenix7"/>
 | 
					      <iq:product id="fenix7" />
 | 
				
			||||||
      <iq:product id="fenix7pro"/>
 | 
					      <iq:product id="fenix7pro" />
 | 
				
			||||||
      <iq:product id="fenix7pronowifi"/>
 | 
					      <iq:product id="fenix7pronowifi" />
 | 
				
			||||||
      <iq:product id="fenix7s"/>
 | 
					      <iq:product id="fenix7s" />
 | 
				
			||||||
      <iq:product id="fenix7spro"/>
 | 
					      <iq:product id="fenix7spro" />
 | 
				
			||||||
      <iq:product id="fenix7x"/>
 | 
					      <iq:product id="fenix7x" />
 | 
				
			||||||
      <iq:product id="fenix7xpro"/>
 | 
					      <iq:product id="fenix7xpro" />
 | 
				
			||||||
      <iq:product id="fenix7xpronowifi"/>
 | 
					      <iq:product id="fenix7xpronowifi" />
 | 
				
			||||||
      <iq:product id="fenixchronos"/>
 | 
					      <iq:product id="fenixchronos" />
 | 
				
			||||||
      <iq:product id="fr245"/>
 | 
					      <iq:product id="fr245" />
 | 
				
			||||||
      <iq:product id="fr245m"/>
 | 
					      <iq:product id="fr245m" />
 | 
				
			||||||
      <iq:product id="fr255"/>
 | 
					      <iq:product id="fr255" />
 | 
				
			||||||
      <iq:product id="fr255m"/>
 | 
					      <iq:product id="fr255m" />
 | 
				
			||||||
      <iq:product id="fr255s"/>
 | 
					      <iq:product id="fr255s" />
 | 
				
			||||||
      <iq:product id="fr255sm"/>
 | 
					      <iq:product id="fr255sm" />
 | 
				
			||||||
      <iq:product id="fr265"/>
 | 
					      <iq:product id="fr265" />
 | 
				
			||||||
      <iq:product id="fr265s"/>
 | 
					      <iq:product id="fr265s" />
 | 
				
			||||||
      <iq:product id="fr55"/>
 | 
					      <iq:product id="fr55" />
 | 
				
			||||||
      <iq:product id="fr645"/>
 | 
					      <iq:product id="fr645" />
 | 
				
			||||||
      <iq:product id="fr645m"/>
 | 
					      <iq:product id="fr645m" />
 | 
				
			||||||
      <iq:product id="fr745"/>
 | 
					      <iq:product id="fr745" />
 | 
				
			||||||
      <iq:product id="fr935"/>
 | 
					      <iq:product id="fr935" />
 | 
				
			||||||
      <iq:product id="fr945"/>
 | 
					      <iq:product id="fr945" />
 | 
				
			||||||
      <iq:product id="fr945lte"/>
 | 
					      <iq:product id="fr945lte" />
 | 
				
			||||||
      <iq:product id="fr955"/>
 | 
					      <iq:product id="fr955" />
 | 
				
			||||||
      <iq:product id="fr965"/>
 | 
					      <iq:product id="fr965" />
 | 
				
			||||||
      <iq:product id="gpsmap67"/>
 | 
					      <iq:product id="gpsmap67" />
 | 
				
			||||||
      <iq:product id="instinct2"/>
 | 
					      <iq:product id="instinct2" />
 | 
				
			||||||
      <iq:product id="instinct2s"/>
 | 
					      <iq:product id="instinct2s" />
 | 
				
			||||||
      <iq:product id="instinct2x"/>
 | 
					      <iq:product id="instinct2x" />
 | 
				
			||||||
      <iq:product id="instinctcrossover"/>
 | 
					      <iq:product id="instinctcrossover" />
 | 
				
			||||||
      <iq:product id="legacyherocaptainmarvel"/>
 | 
					      <iq:product id="legacyherocaptainmarvel" />
 | 
				
			||||||
      <iq:product id="legacyherofirstavenger"/>
 | 
					      <iq:product id="legacyherofirstavenger" />
 | 
				
			||||||
      <iq:product id="legacysagadarthvader"/>
 | 
					      <iq:product id="legacysagadarthvader" />
 | 
				
			||||||
      <iq:product id="legacysagarey"/>
 | 
					      <iq:product id="legacysagarey" />
 | 
				
			||||||
      <iq:product id="marq2"/>
 | 
					      <iq:product id="marq2" />
 | 
				
			||||||
      <iq:product id="marq2aviator"/>
 | 
					      <iq:product id="marq2aviator" />
 | 
				
			||||||
      <iq:product id="marqadventurer"/>
 | 
					      <iq:product id="marqadventurer" />
 | 
				
			||||||
      <iq:product id="marqathlete"/>
 | 
					      <iq:product id="marqathlete" />
 | 
				
			||||||
      <iq:product id="marqaviator"/>
 | 
					      <iq:product id="marqaviator" />
 | 
				
			||||||
      <iq:product id="marqcaptain"/>
 | 
					      <iq:product id="marqcaptain" />
 | 
				
			||||||
      <iq:product id="marqcommander"/>
 | 
					      <iq:product id="marqcommander" />
 | 
				
			||||||
      <iq:product id="marqdriver"/>
 | 
					      <iq:product id="marqdriver" />
 | 
				
			||||||
      <iq:product id="marqexpedition"/>
 | 
					      <iq:product id="marqexpedition" />
 | 
				
			||||||
      <iq:product id="marqgolfer"/>
 | 
					      <iq:product id="marqgolfer" />
 | 
				
			||||||
      <iq:product id="montana7xx"/>
 | 
					      <iq:product id="montana7xx" />
 | 
				
			||||||
      <iq:product id="venu"/>
 | 
					      <iq:product id="venu" />
 | 
				
			||||||
      <iq:product id="venu2"/>
 | 
					      <iq:product id="venu2" />
 | 
				
			||||||
      <iq:product id="venu2plus"/>
 | 
					      <iq:product id="venu2plus" />
 | 
				
			||||||
      <iq:product id="venu2s"/>
 | 
					      <iq:product id="venu2s" />
 | 
				
			||||||
      <iq:product id="venu3"/>
 | 
					      <iq:product id="venu3" />
 | 
				
			||||||
      <iq:product id="venu3s"/>
 | 
					      <iq:product id="venu3s" />
 | 
				
			||||||
      <iq:product id="venud"/>
 | 
					      <iq:product id="venud" />
 | 
				
			||||||
      <iq:product id="venusq"/>
 | 
					      <iq:product id="venusq" />
 | 
				
			||||||
      <iq:product id="venusq2"/>
 | 
					      <iq:product id="venusq2" />
 | 
				
			||||||
      <iq:product id="venusq2m"/>
 | 
					      <iq:product id="venusq2m" />
 | 
				
			||||||
      <iq:product id="venusqm"/>
 | 
					      <iq:product id="venusqm" />
 | 
				
			||||||
      <iq:product id="vivoactive3"/>
 | 
					      <iq:product id="vivoactive3" />
 | 
				
			||||||
      <iq:product id="vivoactive3m"/>
 | 
					      <iq:product id="vivoactive3m" />
 | 
				
			||||||
      <iq:product id="vivoactive3mlte"/>
 | 
					      <iq:product id="vivoactive3mlte" />
 | 
				
			||||||
      <iq:product id="vivoactive4"/>
 | 
					      <iq:product id="vivoactive4" />
 | 
				
			||||||
      <iq:product id="vivoactive4s"/>
 | 
					      <iq:product id="vivoactive4s" />
 | 
				
			||||||
      <iq:product id="vivoactive5"/>
 | 
					      <iq:product id="vivoactive5" />
 | 
				
			||||||
    </iq:products>
 | 
					    </iq:products>
 | 
				
			||||||
    <!--
 | 
					    <!--
 | 
				
			||||||
      Use "Monkey C: Edit Permissions" from the Visual Studio Code command
 | 
					      Use "Monkey C: Edit Permissions" from the Visual Studio Code command
 | 
				
			||||||
      palette to update permissions.
 | 
					      palette to update permissions.
 | 
				
			||||||
    -->
 | 
					    -->
 | 
				
			||||||
    <iq:permissions>
 | 
					    <iq:permissions>
 | 
				
			||||||
      <iq:uses-permission id="Background"/>
 | 
					      <iq:uses-permission id="Background" />
 | 
				
			||||||
      <iq:uses-permission id="BluetoothLowEnergy"/>
 | 
					      <iq:uses-permission id="BluetoothLowEnergy" />
 | 
				
			||||||
      <iq:uses-permission id="Communications"/>
 | 
					      <iq:uses-permission id="Communications" />
 | 
				
			||||||
 | 
					      <iq:uses-permission id="Positioning" />
 | 
				
			||||||
    </iq:permissions>
 | 
					    </iq:permissions>
 | 
				
			||||||
    <!--
 | 
					    <!--
 | 
				
			||||||
      Use "Monkey C: Edit Languages" from the Visual Studio Code command
 | 
					      Use "Monkey C: Edit Languages" from the Visual Studio Code command
 | 
				
			||||||
@@ -196,6 +199,6 @@
 | 
				
			|||||||
      Use "Monkey C: Configure Monkey Barrel" from the Visual Studio Code
 | 
					      Use "Monkey C: Configure Monkey Barrel" from the Visual Studio Code
 | 
				
			||||||
      command palette to edit the included barrels.
 | 
					      command palette to edit the included barrels.
 | 
				
			||||||
    -->
 | 
					    -->
 | 
				
			||||||
    <iq:barrels/>
 | 
					    <iq:barrels />
 | 
				
			||||||
  </iq:application>
 | 
					  </iq:application>
 | 
				
			||||||
</iq:manifest>
 | 
					</iq:manifest>
 | 
				
			||||||
@@ -38,12 +38,43 @@ class BackgroundServiceDelegate extends System.ServiceDelegate {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function onTemporalEvent() as Void {
 | 
					    function onTemporalEvent() as Void {
 | 
				
			||||||
        if (! System.getDeviceSettings().phoneConnected) {
 | 
					        if (!System.getDeviceSettings().phoneConnected) {
 | 
				
			||||||
            // System.println("BackgroundServiceDelegate onTemporalEvent(): No Phone connection, skipping API call.");
 | 
					            // System.println("BackgroundServiceDelegate onTemporalEvent(): No Phone connection, skipping API call.");
 | 
				
			||||||
        } else if (! System.getDeviceSettings().connectionAvailable) {
 | 
					        } else if (!System.getDeviceSettings().connectionAvailable) {
 | 
				
			||||||
            // System.println("BackgroundServiceDelegate onTemporalEvent(): No Internet connection, skipping API call.");
 | 
					            // System.println("BackgroundServiceDelegate onTemporalEvent(): No Internet connection, skipping API call.");
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
 | 
					            // System.println("BackgroundServiceDelegate onTemporalEvent(): Making API call.");
 | 
				
			||||||
 | 
					            var position = Position.getInfo();
 | 
				
			||||||
 | 
					            // System.println("BackgroundServiceDelegate onTemporalEvent(): gps: " + position.position.toDegrees());
 | 
				
			||||||
 | 
					            // System.println("BackgroundServiceDelegate onTemporalEvent(): speed: " + position.speed);
 | 
				
			||||||
 | 
					            // System.println("BackgroundServiceDelegate onTemporalEvent(): course: " + position.heading + "rad (" + (position.heading * 180 / Math.PI) + "°)");
 | 
				
			||||||
 | 
					            // System.println("BackgroundServiceDelegate onTemporalEvent(): altitude: " + position.altitude);
 | 
				
			||||||
 | 
					            // System.println("BackgroundServiceDelegate onTemporalEvent(): battery: " + System.getSystemStats().battery);
 | 
				
			||||||
 | 
					            // System.println("BackgroundServiceDelegate onTemporalEvent(): charging: " + System.getSystemStats().charging);
 | 
				
			||||||
 | 
					            // System.println("BackgroundServiceDelegate onTemporalEvent(): activity: " + Activity.getProfileInfo().name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // Don't use Settings.* here as the object lasts < 30 secs and is recreated each time the background service is run
 | 
					            // Don't use Settings.* here as the object lasts < 30 secs and is recreated each time the background service is run
 | 
				
			||||||
 | 
					            Communications.makeWebRequest(
 | 
				
			||||||
 | 
					                (Properties.getValue("api_url") as Lang.String) + "/webhook/" + (Properties.getValue("webhook_id") as Lang.String),
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "type" => "update_location",
 | 
				
			||||||
 | 
					                    "data" => {
 | 
				
			||||||
 | 
					                        "gps" => position.position.toDegrees(),
 | 
				
			||||||
 | 
					                        "gps_accuracy" => 10,
 | 
				
			||||||
 | 
					                        "speed" => Math.round(position.speed),
 | 
				
			||||||
 | 
					                        "course" => Math.round(position.heading * 180 / Math.PI),
 | 
				
			||||||
 | 
					                        "altitude" => Math.round(position.altitude),
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    :method       => Communications.HTTP_REQUEST_METHOD_POST,
 | 
				
			||||||
 | 
					                    :headers      => {
 | 
				
			||||||
 | 
					                        "Content-Type" => Communications.REQUEST_CONTENT_TYPE_JSON
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    :responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                method(:onReturnBatteryUpdate)
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
            Communications.makeWebRequest(
 | 
					            Communications.makeWebRequest(
 | 
				
			||||||
                (Properties.getValue("api_url") as Lang.String) + "/webhook/" + (Properties.getValue("webhook_id") as Lang.String),
 | 
					                (Properties.getValue("api_url") as Lang.String) + "/webhook/" + (Properties.getValue("webhook_id") as Lang.String),
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
@@ -58,6 +89,11 @@ class BackgroundServiceDelegate extends System.ServiceDelegate {
 | 
				
			|||||||
                            "state"     => System.getSystemStats().charging,
 | 
					                            "state"     => System.getSystemStats().charging,
 | 
				
			||||||
                            "type"      => "binary_sensor",
 | 
					                            "type"      => "binary_sensor",
 | 
				
			||||||
                            "unique_id" => "battery_is_charging"
 | 
					                            "unique_id" => "battery_is_charging"
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "state"     => Activity.getProfileInfo().name,
 | 
				
			||||||
 | 
					                            "type"      => "sensor",
 | 
				
			||||||
 | 
					                            "unique_id" => "activity"
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    ]
 | 
					                    ]
 | 
				
			||||||
                },
 | 
					                },
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -62,10 +62,12 @@ class WebhookManager {
 | 
				
			|||||||
                ErrorView.show(WatchUi.loadResource($.Rez.Strings.WebhookFailed) as Lang.String + "\n" + WatchUi.loadResource($.Rez.Strings.ApiUrlNotFound) as Lang.String);
 | 
					                ErrorView.show(WatchUi.loadResource($.Rez.Strings.WebhookFailed) as Lang.String + "\n" + WatchUi.loadResource($.Rez.Strings.ApiUrlNotFound) as Lang.String);
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            case 200:
 | 
				
			||||||
            case 201:
 | 
					            case 201:
 | 
				
			||||||
                var id = data.get("webhook_id") as Lang.String or Null;
 | 
					                var id = data.get("webhook_id") as Lang.String or Null;
 | 
				
			||||||
                if (id != null) {
 | 
					                if (id != null) {
 | 
				
			||||||
                    Settings.setWebhookId(id);
 | 
					                    Settings.setWebhookId(id);
 | 
				
			||||||
 | 
					                    // System.println("WebhookManager onReturnRegisterWebhookSensor(): Registering first sensor: Battery Level");
 | 
				
			||||||
                    registerWebhookSensor({
 | 
					                    registerWebhookSensor({
 | 
				
			||||||
                        "device_class"        => "battery",
 | 
					                        "device_class"        => "battery",
 | 
				
			||||||
                        "name"                => "Battery Level",
 | 
					                        "name"                => "Battery Level",
 | 
				
			||||||
@@ -76,16 +78,7 @@ class WebhookManager {
 | 
				
			|||||||
                        "state_class"         => "measurement",
 | 
					                        "state_class"         => "measurement",
 | 
				
			||||||
                        "entity_category"     => "diagnostic",
 | 
					                        "entity_category"     => "diagnostic",
 | 
				
			||||||
                        "disabled"            => false
 | 
					                        "disabled"            => false
 | 
				
			||||||
                    });
 | 
					                    }, 0);
 | 
				
			||||||
                    registerWebhookSensor({
 | 
					 | 
				
			||||||
                        "device_class"    => "battery_charging",
 | 
					 | 
				
			||||||
                        "name"            => "Battery is Charging",
 | 
					 | 
				
			||||||
                        "state"           => System.getSystemStats().charging,
 | 
					 | 
				
			||||||
                        "type"            => "binary_sensor",
 | 
					 | 
				
			||||||
                        "unique_id"       => "battery_is_charging",
 | 
					 | 
				
			||||||
                        "entity_category" => "diagnostic",
 | 
					 | 
				
			||||||
                        "disabled"        => false
 | 
					 | 
				
			||||||
                    });
 | 
					 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    // System.println("WebhookManager onReturnRequestWebhookId(): No webhook id in response data.");
 | 
					                    // System.println("WebhookManager onReturnRequestWebhookId(): No webhook id in response data.");
 | 
				
			||||||
                    Settings.unsetIsBatteryLevelEnabled();
 | 
					                    Settings.unsetIsBatteryLevelEnabled();
 | 
				
			||||||
@@ -129,7 +122,7 @@ class WebhookManager {
 | 
				
			|||||||
        );
 | 
					        );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function onReturnRegisterWebhookSensor(responseCode as Lang.Number, data as Null or Lang.Dictionary or Lang.String) as Void {
 | 
					    function onReturnRegisterWebhookSensor(responseCode as Lang.Number, data as Null or Lang.Dictionary or Lang.String, step as Lang.Number) as Void {
 | 
				
			||||||
        switch (responseCode) {
 | 
					        switch (responseCode) {
 | 
				
			||||||
            case Communications.BLE_HOST_TIMEOUT:
 | 
					            case Communications.BLE_HOST_TIMEOUT:
 | 
				
			||||||
            case Communications.BLE_CONNECTION_UNAVAILABLE:
 | 
					            case Communications.BLE_CONNECTION_UNAVAILABLE:
 | 
				
			||||||
@@ -155,6 +148,7 @@ class WebhookManager {
 | 
				
			|||||||
                Settings.unsetWebhookId();
 | 
					                Settings.unsetWebhookId();
 | 
				
			||||||
                // Ignore and see if we can carry on
 | 
					                // Ignore and see if we can carry on
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            case Communications.INVALID_HTTP_BODY_IN_NETWORK_RESPONSE:
 | 
					            case Communications.INVALID_HTTP_BODY_IN_NETWORK_RESPONSE:
 | 
				
			||||||
                // System.println("WebhookManager onReturnRegisterWebhookSensor() Response Code: INVALID_HTTP_BODY_IN_NETWORK_RESPONSE, check JSON is returned.");
 | 
					                // System.println("WebhookManager onReturnRegisterWebhookSensor() Response Code: INVALID_HTTP_BODY_IN_NETWORK_RESPONSE, check JSON is returned.");
 | 
				
			||||||
                Settings.unsetWebhookId();
 | 
					                Settings.unsetWebhookId();
 | 
				
			||||||
@@ -169,12 +163,37 @@ class WebhookManager {
 | 
				
			|||||||
                ErrorView.show(WatchUi.loadResource($.Rez.Strings.WebhookFailed) as Lang.String + "\n" + WatchUi.loadResource($.Rez.Strings.ApiUrlNotFound) as Lang.String);
 | 
					                ErrorView.show(WatchUi.loadResource($.Rez.Strings.WebhookFailed) as Lang.String + "\n" + WatchUi.loadResource($.Rez.Strings.ApiUrlNotFound) as Lang.String);
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            case 200:
 | 
				
			||||||
            case 201:
 | 
					            case 201:
 | 
				
			||||||
                if ((data.get("success") as Lang.Boolean or Null) != true) {
 | 
					                if ((data.get("success") as Lang.Boolean or Null) != false) {
 | 
				
			||||||
                // When uncommenting, invert the condition above.
 | 
					                    // System.println("WebhookManager onReturnRegisterWebhookSensor(): Success");
 | 
				
			||||||
                //     System.println("WebhookManager onReturnRegisterWebhookSensor(): Success");
 | 
					                    switch (step) {
 | 
				
			||||||
                // } else {
 | 
					                        case 0:
 | 
				
			||||||
                //     System.println("WebhookManager onReturnRegisterWebhookSensor(): Failure");
 | 
					                            // System.println("WebhookManager onReturnRegisterWebhookSensor(): Registering next sensor: Battery is Charging");
 | 
				
			||||||
 | 
					                            registerWebhookSensor({
 | 
				
			||||||
 | 
					                                "device_class"    => "battery_charging",
 | 
				
			||||||
 | 
					                                "name"            => "Battery is Charging",
 | 
				
			||||||
 | 
					                                "state"           => System.getSystemStats().charging,
 | 
				
			||||||
 | 
					                                "type"            => "binary_sensor",
 | 
				
			||||||
 | 
					                                "unique_id"       => "battery_is_charging",
 | 
				
			||||||
 | 
					                                "entity_category" => "diagnostic",
 | 
				
			||||||
 | 
					                                "disabled"        => false
 | 
				
			||||||
 | 
					                            }, 1);
 | 
				
			||||||
 | 
					                            break;
 | 
				
			||||||
 | 
					                        case 1:
 | 
				
			||||||
 | 
					                            // System.println("WebhookManager onReturnRegisterWebhookSensor(): Registering next sensor: Activity");
 | 
				
			||||||
 | 
					                            registerWebhookSensor({
 | 
				
			||||||
 | 
					                                "name"                => "Activity",
 | 
				
			||||||
 | 
					                                "state"               => Activity.getProfileInfo().name,
 | 
				
			||||||
 | 
					                                "type"                => "sensor",
 | 
				
			||||||
 | 
					                                "unique_id"           => "activity",
 | 
				
			||||||
 | 
					                                "disabled"            => false
 | 
				
			||||||
 | 
					                            }, 2);
 | 
				
			||||||
 | 
					                            break;
 | 
				
			||||||
 | 
					                        default:
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    // System.println("WebhookManager onReturnRegisterWebhookSensor(): Failure");
 | 
				
			||||||
                    Settings.unsetWebhookId();
 | 
					                    Settings.unsetWebhookId();
 | 
				
			||||||
                    Settings.unsetIsBatteryLevelEnabled();
 | 
					                    Settings.unsetIsBatteryLevelEnabled();
 | 
				
			||||||
                    ErrorView.show(WatchUi.loadResource($.Rez.Strings.WebhookFailed) as Lang.String);
 | 
					                    ErrorView.show(WatchUi.loadResource($.Rez.Strings.WebhookFailed) as Lang.String);
 | 
				
			||||||
@@ -189,7 +208,7 @@ class WebhookManager {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function registerWebhookSensor(sensor as Lang.Object) {
 | 
					    function registerWebhookSensor(sensor as Lang.Object, step as Lang.Number) {
 | 
				
			||||||
        // System.println("WebhookManager registerWebhookSensor(): Registering webhook sensor: " + sensor.toString());
 | 
					        // System.println("WebhookManager registerWebhookSensor(): Registering webhook sensor: " + sensor.toString());
 | 
				
			||||||
        Communications.makeWebRequest(
 | 
					        Communications.makeWebRequest(
 | 
				
			||||||
            Settings.getApiUrl() + "/webhook/" + Settings.getWebhookId(),
 | 
					            Settings.getApiUrl() + "/webhook/" + Settings.getWebhookId(),
 | 
				
			||||||
@@ -202,7 +221,8 @@ class WebhookManager {
 | 
				
			|||||||
                :headers      => {
 | 
					                :headers      => {
 | 
				
			||||||
                    "Content-Type" => Communications.REQUEST_CONTENT_TYPE_JSON
 | 
					                    "Content-Type" => Communications.REQUEST_CONTENT_TYPE_JSON
 | 
				
			||||||
                },
 | 
					                },
 | 
				
			||||||
                :responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON
 | 
					                :responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON,
 | 
				
			||||||
 | 
					                :context      => step
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            method(:onReturnRegisterWebhookSensor)
 | 
					            method(:onReturnRegisterWebhookSensor)
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user