Commit Graph
68 Commits
Author SHA1 Message Date
Daniele Gobbetti 29787d0c9b Garmin: add gpx import functionality for models that support it
Add a Field definition for GPS coordinates and remove the corresponding method from GarminUtils.
Add a new message COURSE and some fields to other known messages.

Also centralize some utility methods in GpxParser and GpxTrack, adapting ZeppOsGpxRouteFile.

Be aware that the capability used to identify the supported watches might be the wrong one.
2024-08-16 18:52:13 +02:00
Daniele Gobbetti f2f6536ea8 Garmin: fix major issue with field encoding/decoding
Our implementation of scale and offset was backwards: we were adding offset and then dividing by scale when decoding fields, but the publicly available protocol description dictates otherwise ( http://web.archive.org/web/20240519102659/https://developer.garmin.com/fit/protocol/#scaleoffset ):  "the binary quantity is divided by the scale factor and then the offset is subtracted".
For this reason the sign of GARMIN_TIME_EPOCH in Timestamp field definition must be flipped as well.
2024-08-16 13:57:00 +02:00
Daniele Gobbetti 7fa5cd1be5 Garmin: further work for auth negotiation
Add status message parsing and change the reply logic for watch-initiated Auth (in attempt to fix #3986): before this changeset the phone would reply with a generic ACK and then send a request to the watch for setting the auth (with all zeroes);
after this changeset the phone replies with a specific auth ack/status message but it ignores what the watch requested and acknowledges back all zeroes.

Blindly implemented based on the legacy vivomoveHR code, not tested against real devices.
2024-08-14 10:04:32 +02:00
Daniele Gobbetti 1d4c85b732 Garmin: implement (some kind of) auth negotiation message
Blindly implemented based on the legacy vivomoveHR code, not tested against real devices.
2024-08-07 14:58:26 +02:00
Daniele Gobbetti 74fbadf553 Pebble: fix webview crash (on android 14)
Older android version also possibly impacted
2024-06-13 16:26:39 +02:00
Daniele Gobbetti fc8b959fea Garmin: only add the cache-control header when updating the AGPS file
Prevents it being stale for too long if the user forgets to fetch an updated file.
If the file has to be updated on the watch the response (http status 200) is sent and cached for 14400 seconds, for this period the watch will not request the file again.
Subsequent requests (http status 304) are very small and should not impact battery life negatively, hence they are sent without adding caching directives.
2024-06-08 16:29:52 +02:00
Daniele Gobbetti 537b0580b5 Garmin: fix for watch staying in synchronizing state on first connection
Reported in issue 3269, https://codeberg.org/Freeyourgadget/Gadgetbridge/issues/3269#issuecomment-1845355

Also run refactor code on the whole file
2024-05-28 12:35:55 +02:00
Daniele Gobbetti ba9e5c8a77 Garmin: various minor changes
remove message placeholders referring to legacy code,
remove try-catch from the weather data message building method
lower the frequency of music control messages
2024-05-24 22:24:09 +02:00
Daniele Gobbetti 9c4da444cf Garmin: fix protobuf chunked fragments handling
remove chunk from the map once it is complete if it is incoming, fix the removal of outgoing chunks
also return a warn log message if the protobuf status is not OK.
2024-05-24 22:24:09 +02:00
Daniele Gobbetti ea1c1c808c Change java package of garmin protobuf files 2024-05-24 22:24:09 +02:00
Daniele Gobbetti 0cf73a2120 Remove all the legacy vivomove HR code.
Also replaces support for device through the new garmin code path.
The Entities are preserved to enable on-demand database migration in case some user had previously synchronized data.
2024-05-24 22:24:09 +02:00
Daniele Gobbetti 709afc5df7 Garmin: fix spurious protobuf messages 2024-05-24 22:24:09 +02:00
Daniele Gobbetti 2a9a01e40b Garmin: improve weather information
Add Aqi Field Definition and field to today weather and daily forecast, as both are available in WeatherSpec.
Add Feels like temperature to hourly forecast but populate with the forecasted temperature as the field is not available in Weatherspec for hourly.
Use temperature Field Definition for dew point and add it to today's weather.

Fields dew point and air quality could have been removed from the hourly weather definition but are kept in to test compatibility of these changes with watches.
2024-05-24 22:24:09 +02:00
Daniele Gobbetti ebe371de3c Garmin: Remove handling of legacy cache directory 2024-05-24 22:24:09 +02:00
Daniele Gobbetti c3a6db3309 Garmin: adjust test after adding distance field 2024-05-24 22:24:09 +02:00
Daniele Gobbetti 906ad0c68f Garmin: enable AGPS update for all Instinct 2 devices 2024-05-24 22:24:08 +02:00
Daniele Gobbetti 457ff8b88f Fixup: Introduce device specific writable directory (MAC address)
Add logic to not fetch again files which had the previously defined name
2024-05-24 22:24:08 +02:00
Daniele Gobbetti 8c88cc992a Introduce device specific writable directory (MAC address)
Also adds temporary method to move the fetched files from the legacy path to the new one which does not include the device name.
Also moves the FileIndex to the end of the cached files to allow for easier sorting.

Cherry-picked from 525b395c01ce57449ee9a8f74af663595223279e and adapted
2024-05-24 22:24:08 +02:00
Daniele Gobbetti 3abf78d8c2 Garmin: enable unicode Emoji for all devices
This seems to be widely supported by garmin devices, hence enable it in the base coordinator. Specific devices not supporting Unicode Emojis can override this method and return false.
2024-05-24 22:24:08 +02:00
Daniele Gobbetti f1f77abe18 Garmin: harmonize device names
All device name strings start with manufacturer name.
Normalized the usage of accented i.
2024-05-24 22:24:08 +02:00
Daniele Gobbetti a5dbb7fea7 Garmin: fix regression in call handling
Add a fictitious action to the notification to enable reply/hangup/reject from the watch.
Also fixes the behavior on sms reply, which should also reject the incoming call.

Change the log level in case some of the canned messages types are left as default to info, as this is a supported scenario.
2024-05-24 22:24:08 +02:00
Daniele Gobbetti 179f8a3a9e Garmin: encode unknown weather codes as invalid 2024-05-24 22:24:08 +02:00
Daniele Gobbetti 9e1bf07cd2 Garmin: add coordinator for Instinct 2 Solar Tactical
confirmed working in https://codeberg.org/Freeyourgadget/Gadgetbridge/issues/3063#issuecomment-1787762
2024-05-24 22:24:08 +02:00
Daniele Gobbetti e46ea03693 Garmin: calendar integration improvements
use the protobuf fields described in the documentation[0]
build the message according to the requested fields

[0] https://gadgetbridge.org/internals/specifics/garmin-protocol/#calendarevent
2024-05-24 22:24:08 +02:00
Daniele Gobbetti 416b7b075c Garmin: fix notification crashes and handle SMS correctly
It looks like (some) watches really don't like having an empty list of actions, hence enable the legacy "refuse" action in every case, leaving it empty and inactive.
Further display the SMS sender in the notification and enable the correct code path for the reply action to work.
2024-05-24 22:24:08 +02:00
Daniele Gobbetti dbc270ad9f Garmin: use developer device setting for keeping data on device
Make use of the previously added preference to toggle file archival (deletion) on the watch.

Default is true (keep data on device) until we are sure of the consequences.
2024-05-24 22:24:08 +02:00
Daniele Gobbetti 01d48cde91 Garmin: Rename LocalMessage to PredefinedLocalMessage and clarify its usage
PredefinedLocalMessage are only useful for FIT messages and should not interfere with FIT files. The only impact of using the local message in fit files was in the textual output, but it was confusing.

Add an explicit constructor to RecordHeader if PredefinedLocalMessage should be taken into account, and use this only in fit messages leaving the default constructor for fit files.

Also adjusts the test case as textual output comparison needs to be fixed.
2024-05-24 22:24:08 +02:00
Daniele Gobbetti 698908a589 Garmin: Add support for custom replies (notifications and calls)
To enable custom replies an override must be defined in the devices coordinator that actually support custom replies.

The custom preferences allow to:
- enable / disable the default message suffix (Instinct 2 appends "sent from my $vendor device" to each reply by default)
- define custom messages to reply to calls and incoming messages (leaving those lists empty will enable the default messages to be used)

Also adds a new protobuf definition file of mostly unknown values that enable toggling the message suffix on Instinct 2.
2024-05-24 22:24:08 +02:00
Daniele Gobbetti 45c13675e0 Garmin: Add support for replying to notifications
This uses the (assumed) new method of passing multiple actions, instead of the (assumed) legacy accept/decline approach.
At the moment the preset messages stored on the watch firmware are used for replying, the code supports using custom messages already but those have to be updated to the watch somehow (probably by protobuf) and this is not supported yet. Using custom messages if they are not set will just do nothing.
The NotificationActionIconPosition values have been determined on a vívomove Style and might not work properly on other watches.
The evaluation of GBDeviceEvent have been moved in GarminSupport since the notification actions handling uses device events.

Also adds a method to read null terminated strings to GarminByteBufferReader.
Also adds a warning in NotificationListener if the wrong handle is used for replying to a notification.
2024-05-24 22:24:08 +02:00
Daniele Gobbetti 54070b2652 Garmin: Add FileDownloadedDeviceEvent and (disabled) file deletion
Also adds (disabled) file deletion in case of already downloaded files
2024-05-24 22:24:08 +02:00
Daniele Gobbetti 2c70f1a616 Garmin: Add DST/Timezone support 2024-05-24 22:24:08 +02:00
Daniele Gobbetti 42e44de1ac Garmin: Support file archival (deletion) on watch
Also add original timestamp to local cache filename as the file identifier are reused
Also fix imports of Test class
2024-05-24 22:24:07 +02:00
Daniele Gobbetti e6365638d4 Garmin protocol: basic file transfer and notification handling
adds synchronization of supported files from watch to external directory
adds support for Activity and Monitoring files (workouts and activity samples), but those are not integrated yet
adds upload functionality (not used ATM and not tested)
adds notification support without actions
introduces centralized processing of "messageHandlers" (protobuf, file transfer, notifications)

also properly dispose of the music timer when disconnecting
2024-05-24 22:24:07 +02:00
Daniele Gobbetti 9dee71df6f Garmin protocol: enable media volume control from watch 2024-05-24 22:24:07 +02:00
Daniele Gobbetti 14c6ce1a3a Garmin protocol: store max packet size from DeviceInformationMessage
also adds messageType to the warnifleftover log message
2024-05-24 22:24:07 +02:00
Daniele Gobbetti 6cb5184e2b Garmin protocol: various changes
- add FitFile class that deals with parsing and generating outgoing files
- consider all field definitions with number 253 as Timestamps [0]
- add support for "compressed timestamps" in fit file parsing. Those are not returned among the other normal fields but are available through a method of RecordData
- adjust the test cases

[0]https://github.com/polyvertex/fitdecode/blob/48b6554d8a3baf33f8b5b9b2fd079fcbe9ac8ce2/fitdecode/reader.py#L719
2024-05-24 22:24:07 +02:00
Daniele Gobbetti e814a63590 Garmin protocol: change naming and logic of several FIT classes
- refactor the logic of Global and Local messages
- add some Global messages with naming taken from [1]
- Global messages are not enum because there are too many
- introduce the concept of FieldDefinitionPrimitive
- add new Field Definitions
- add support for developer fields and array fields
- add test case for FIT files taken from [0]

[0] https://github.com/polyvertex/fitdecode/
[1] https://www.fitfileviewer.com/
2024-05-24 22:24:07 +02:00
Daniele Gobbetti b2f995b736 Garmin protocol: create helper class GarminByteBufferReader
separate the logic specific for GFDI messages from the generally useful logic.
Also centralize the logging in case of leftover bytes while parsing GFDI messages.
2024-05-24 22:24:07 +02:00
Daniele Gobbetti 8524426b70 Garmin protocol: create custom GBDeviceEvent for weather request 2024-05-24 22:24:07 +02:00
Daniele Gobbetti 4054326535 Garmin protocol: use message enum instead of id in GFDI Messages 2024-05-24 22:24:07 +02:00
Daniele Gobbetti c8c51064c3 Garmin protocol: refactoring and fixes of BaseTypes
The boundaries are enforced on the stored value when decoding, before applying the adjustments for scale and offset.
Also add some tests for the BaseTypes
Introduce new FieldDefinition for Temperature and WeatherCondition (removing the static class)
Add accessors for field data in the containing RecordData, thus keeping the FieldData private
2024-05-24 22:24:07 +02:00
Daniele Gobbetti 71f497ecbb Garmin protocol: create specific field definition for day of week 2024-05-24 22:24:07 +02:00
Daniele Gobbetti e323e7fbde Garmin protocol: move field encode/decode interface to the FieldDefinition
This allows for semantic subclassing the FieldDefinition.
A FieldDefinitionTimestamp subclass is introduced as example
2024-05-24 22:24:07 +02:00
Daniele Gobbetti 4313fc833a Garmin protocol: fix invalid signed int base type value 2024-05-24 22:24:07 +02:00
Daniele Gobbetti e691042265 Garmin protocol: add initial support for FIT messages
note: only weather message definition and data tested so far
also enable weather support for Instinct 2S and vivomove style
also cleanup some unused constants that have been migrated to new enums in GFDIMessage
additionally switch to new local implementation of GarminTimeUtils with needed methods
2024-05-24 22:24:07 +02:00
Daniele Gobbetti afe41ee563 Garmin protocol: fixes
- fix DEVICE_SETTINGS message ID
- put all status messages in own package
- allow protobuf handler to change the returned status message to signal unsupported requests
- fix various bugs
2024-05-24 22:24:07 +02:00
Daniele Gobbetti 559a73cc5e Garmin protocol: initial refactoring and basic functionalities
This commit takes aims to bring many new garmin devices up to a working status, with basic functionalities such as:
- garmin protocol initialization
- basic message exchange
- support for some messages in Garmin own format
- support for some messages in protobuf format
2024-05-24 22:24:07 +02:00
Daniele Gobbetti 9c68acce2e Add support for exclusive audio focus
This pauses temporarily other apps that are playing sound while our notifications get spoken.
2024-05-14 16:06:03 +02:00
Daniele Gobbetti 173e2d29b0 Include Organizer and Reminders when reading calendar events
Also use the named column indexes instead of numeric ids when retrieving the contents to make it more clear and more robust in case further fields are added later.

Reminders are set as absolute timestamp.
2024-04-25 11:46:34 +02:00
Daniele Gobbetti ff9207cd9a Nothing: add option to read aloud incoming notifications.
Also fixes a bug where the call would be accepted twice if the tts was not bound.
2024-04-12 16:51:49 +02:00
Daniele Gobbetti 1a8689d4bf Add "Delta Chat" to the recognized applications and as generic chat 2024-04-12 09:21:54 +02:00
Daniele Gobbetti e00d234f09 Add GENERIC_PHONE and GENERIC_CALENDAR NotificationType handling 2024-04-10 14:20:20 +02:00
Daniele Gobbetti a37f0c89bb Nothing: add adjustable delay for auto-pick-up of calls
- Also add a (basic) Application wide TextToSpeech helper
- use the TextToSpeech to announce the caller name or number
2024-04-05 19:55:22 +02:00
Daniele Gobbetti c4747e2e23 Nothing: add option to auto-reply to incoming phone calls
The new preference to toggle the auto-reply behavior is not
prefixed with the device name, as I guess it could be useful
also for other bluetooth headphones
2024-04-05 19:55:22 +02:00
Daniele Gobbetti edcdd33f0c Rename fastlane main folder to mainline to reflect build flavor
Also update banglejs symlink to keep it valid.

Fixes #3588
2024-02-21 15:07:12 +01:00
Daniele Gobbetti 0da552aa33 GenericWeatherReceiver: use forecast source for uvIndex and precipProbability 2023-10-27 19:01:10 +02:00
Daniele Gobbetti 063fb31931 Garmin VivoMoveHR: prevent app crash
Use a more robust cast approach to prevent application crashes in some corner cases (e.g. when writing Math.round()ed values)
Since I don't own a VivoMoveHR device I couldn't test for regressions on the watch.
2023-08-04 17:57:46 +02:00
Daniele Gobbetti 53c06b8c31 Introduce native app shortcuts for android > 30 2023-07-25 18:28:35 +02:00
Daniele Gobbetti 540a4499f6 Miband 6: enable PAI and Stress support 2023-07-25 18:23:15 +02:00
Daniele Gobbetti 5d6109a4fb No functional changes, only run "Reformat code" 2022-11-27 19:02:52 +01:00
Daniele Gobbetti 7f24ba8ffb Drastic rewrite of discovery activity.
- get rid of pre-lollipop BLE discovery (nowadays we support only lollipop and above) and related preference
- get rid of the sequenced BT-then-BLE-scan that wasn't working reliably anyway and was causing a recursion
- add a caching layer for already processed devices (the same device is found multiple times during discovery)
- add a caching layer for device name in GBDeviceCandidate (many coordinators will ask for it, and it's a very expensive operation)
2022-11-27 18:59:22 +01:00
Daniele GobbettiandGitea b4b153c62d Introduce app shortcuts
This adds the functionality of long-pressing the launcher icon for directly connecting a device.
The devices are automatically added as shortcuts when they are being connected.
The helper library handles the maximum number of shortcuts automatically.
2022-10-02 17:18:41 +02:00
Daniele Gobbetti b0f22815b0 Reset the battery icon if battery level is unknown 2021-11-05 18:33:33 +01:00
Daniele Gobbetti 7e0f44d3f9 Nothing Ear (1): small adjustments to the battery icons
also remove the suitcase drawable
2021-11-05 17:50:48 +01:00
Daniele Gobbettiandvanous 64b52e5edf Nothing Ear (1): add multiple batteries support 2021-11-02 21:15:25 +01:00
Daniele Gobbettiandvanous 1ce0cd683e Fix forgotten batteryState index 2021-11-02 21:15:25 +01:00
Daniele Gobbetti f8cc520ede BtClassic: generalize device initialization
Also override the new generic initialization for Nothing Ear (1)
2021-10-31 15:54:36 +01:00
Daniele Gobbetti 9ad7e210b7 Nothing Ear (1): Read audio status from device and various fixes:
- add support for ANC-light mode
- handle multiple GBDeviceEvents
- add fake fw and hw versions to make DBHelper happy
- fix battery charge detection logic
- extract some strings to resources
2021-10-07 20:25:26 +02:00