2021-01-10 23:37:09 +01:00
|
|
|
/* Copyright (C) 2016-2021 Andreas Shimokawa, Carsten Pfeiffer, Daniele
|
2019-12-15 22:07:00 +01:00
|
|
|
Gobbetti, Gordon Williams, José Rebelo
|
|
|
|
|
|
|
|
This file is part of Gadgetbridge.
|
|
|
|
|
|
|
|
Gadgetbridge is free software: you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU Affero General Public License as published
|
|
|
|
by the Free Software Foundation, either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
Gadgetbridge is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU Affero General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU Affero General Public License
|
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
2019-11-28 19:02:47 +01:00
|
|
|
package nodomain.freeyourgadget.gadgetbridge.devices.banglejs;
|
|
|
|
|
[Banglejs] Send phone location data to banglejs, which can be used as gps data (#2992)
Since the PR #2961 aswell as #2976, i pushed the changes to this pr.
Original text:
With this PR, the gadgetbridge app sends the current locationd data, obtained from the gps or network provider, to a connected banglejs device as an "gps" event.
The bangle device can use this data instead of the internal gps data. Therefor saving battery energy, since the gps chip is one of the biggest energy consumers.
Furthermore it enables the banglejs device to use the location data, based on the network with which the phone is currently connected. This would be usefull if there is no gps signal.
Updates:
I added a network provider so that it is possible to use the network location. I also overload the start method of GBLocationManager so that it is now possible to select which provider should be used to get the data (currently GPS or Network) and to set a interval to determine how often the update should be run.
For the banglejs device i added a switch to enable the sending of gps data. I also added a setting, to set the interval on how often the gps data is being updated. This allows to throttle the updates of the gps data and therefore saving energy of the smartphone batterie.
To further save energy, the app now requestes the current status of the gps from the banglejs and only sends data, if the gps of the banglejs is turned on.
In the PR #2976 I also moved the settings to the device settings of the banglejs and i moved the logic to the onLocationChanged method of the GBLocationManager.
Co-authored-by: Lukas <lukas.edi@gmx.net>
Reviewed-on: https://codeberg.org/Freeyourgadget/Gadgetbridge/pulls/2992
Co-authored-by: LukasEdl <lukasedl@noreply.codeberg.org>
Co-committed-by: LukasEdl <lukasedl@noreply.codeberg.org>
2022-12-12 08:48:19 +01:00
|
|
|
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_DEVICE_GPS_UPDATE;
|
|
|
|
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_DEVICE_INTENTS;
|
|
|
|
|
2019-12-14 12:16:23 +01:00
|
|
|
import android.annotation.TargetApi;
|
2019-11-28 19:02:47 +01:00
|
|
|
import android.app.Activity;
|
2019-12-14 12:16:23 +01:00
|
|
|
import android.bluetooth.le.ScanFilter;
|
2019-11-28 19:02:47 +01:00
|
|
|
import android.content.Context;
|
|
|
|
import android.net.Uri;
|
2019-12-14 12:16:23 +01:00
|
|
|
import android.os.Build;
|
2019-11-28 19:02:47 +01:00
|
|
|
import android.os.ParcelUuid;
|
2019-12-14 12:16:23 +01:00
|
|
|
|
2019-11-28 19:02:47 +01:00
|
|
|
import androidx.annotation.NonNull;
|
|
|
|
|
2019-12-14 12:16:23 +01:00
|
|
|
import java.util.Collection;
|
|
|
|
import java.util.Collections;
|
2022-05-18 17:31:22 +02:00
|
|
|
import java.util.Vector;
|
2019-12-14 12:16:23 +01:00
|
|
|
|
2022-05-18 17:31:22 +02:00
|
|
|
import nodomain.freeyourgadget.gadgetbridge.BuildConfig;
|
2022-06-10 13:01:12 +02:00
|
|
|
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
2021-07-06 09:22:52 +02:00
|
|
|
import nodomain.freeyourgadget.gadgetbridge.R;
|
2022-06-13 09:35:32 +02:00
|
|
|
import nodomain.freeyourgadget.gadgetbridge.activities.appmanager.AppManagerActivity;
|
2022-07-10 22:01:20 +02:00
|
|
|
import nodomain.freeyourgadget.gadgetbridge.devices.AbstractBLEDeviceCoordinator;
|
2019-11-28 19:02:47 +01:00
|
|
|
import nodomain.freeyourgadget.gadgetbridge.devices.InstallHandler;
|
|
|
|
import nodomain.freeyourgadget.gadgetbridge.devices.SampleProvider;
|
|
|
|
import nodomain.freeyourgadget.gadgetbridge.entities.DaoSession;
|
|
|
|
import nodomain.freeyourgadget.gadgetbridge.entities.Device;
|
|
|
|
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
|
|
|
|
import nodomain.freeyourgadget.gadgetbridge.impl.GBDeviceCandidate;
|
|
|
|
import nodomain.freeyourgadget.gadgetbridge.model.ActivitySample;
|
|
|
|
import nodomain.freeyourgadget.gadgetbridge.model.DeviceType;
|
[Banglejs] Send phone location data to banglejs, which can be used as gps data (#2992)
Since the PR #2961 aswell as #2976, i pushed the changes to this pr.
Original text:
With this PR, the gadgetbridge app sends the current locationd data, obtained from the gps or network provider, to a connected banglejs device as an "gps" event.
The bangle device can use this data instead of the internal gps data. Therefor saving battery energy, since the gps chip is one of the biggest energy consumers.
Furthermore it enables the banglejs device to use the location data, based on the network with which the phone is currently connected. This would be usefull if there is no gps signal.
Updates:
I added a network provider so that it is possible to use the network location. I also overload the start method of GBLocationManager so that it is now possible to select which provider should be used to get the data (currently GPS or Network) and to set a interval to determine how often the update should be run.
For the banglejs device i added a switch to enable the sending of gps data. I also added a setting, to set the interval on how often the gps data is being updated. This allows to throttle the updates of the gps data and therefore saving energy of the smartphone batterie.
To further save energy, the app now requestes the current status of the gps from the banglejs and only sends data, if the gps of the banglejs is turned on.
In the PR #2976 I also moved the settings to the device settings of the banglejs and i moved the logic to the onLocationChanged method of the GBLocationManager.
Co-authored-by: Lukas <lukas.edi@gmx.net>
Reviewed-on: https://codeberg.org/Freeyourgadget/Gadgetbridge/pulls/2992
Co-authored-by: LukasEdl <lukasedl@noreply.codeberg.org>
Co-committed-by: LukasEdl <lukasedl@noreply.codeberg.org>
2022-12-12 08:48:19 +01:00
|
|
|
import nodomain.freeyourgadget.gadgetbridge.util.Prefs;
|
2019-11-28 19:02:47 +01:00
|
|
|
|
2022-07-10 22:01:20 +02:00
|
|
|
public class BangleJSCoordinator extends AbstractBLEDeviceCoordinator {
|
2019-11-28 19:02:47 +01:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public DeviceType getDeviceType() {
|
|
|
|
return DeviceType.BANGLEJS;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public String getManufacturer() {
|
|
|
|
return "Espruino";
|
|
|
|
}
|
|
|
|
|
2019-12-14 12:16:23 +01:00
|
|
|
@NonNull
|
2019-11-28 19:02:47 +01:00
|
|
|
@Override
|
|
|
|
public Collection<? extends ScanFilter> createBLEScanFilters() {
|
|
|
|
// TODO: filter on name beginning Bangle.js? Doesn't appear to be built-in :(
|
|
|
|
// https://developer.android.com/reference/android/bluetooth/le/ScanFilter.Builder.html#setDeviceName(java.lang.String)
|
|
|
|
ParcelUuid hpService = new ParcelUuid(BangleJSConstants.UUID_SERVICE_NORDIC_UART);
|
|
|
|
ScanFilter filter = new ScanFilter.Builder().setServiceUuid(hpService).build();
|
|
|
|
return Collections.singletonList(filter);
|
|
|
|
}
|
|
|
|
|
2019-12-14 12:16:23 +01:00
|
|
|
@NonNull
|
2019-11-28 19:02:47 +01:00
|
|
|
@Override
|
|
|
|
public DeviceType getSupportedType(GBDeviceCandidate candidate) {
|
|
|
|
String name = candidate.getDevice().getName();
|
2019-12-09 11:23:31 +01:00
|
|
|
/* Filter by Espruino devices to avoid getting
|
|
|
|
the device chooser full of spam devices. */
|
|
|
|
if (name != null && (
|
|
|
|
name.startsWith("Bangle.js") ||
|
|
|
|
name.startsWith("Pixl.js") ||
|
|
|
|
name.startsWith("Puck.js") ||
|
|
|
|
name.startsWith("MDBT42Q") ||
|
|
|
|
name.startsWith("Espruino")))
|
2019-11-28 19:02:47 +01:00
|
|
|
return DeviceType.BANGLEJS;
|
|
|
|
|
2019-12-09 11:23:31 +01:00
|
|
|
return DeviceType.UNKNOWN;
|
2019-11-28 19:02:47 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int getBondingStyle(){
|
2019-12-09 15:31:08 +01:00
|
|
|
// Let the user decide whether to bond or not after discovery.
|
|
|
|
return BONDING_STYLE_ASK;
|
2019-11-28 19:02:47 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean supportsCalendarEvents() {
|
2022-05-25 21:40:10 +02:00
|
|
|
return true;
|
2019-11-28 19:02:47 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2020-12-04 17:30:19 +01:00
|
|
|
public boolean supportsRealtimeData() {
|
|
|
|
return true;
|
2019-11-28 19:02:47 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean supportsWeather() {
|
2019-11-29 18:01:57 +01:00
|
|
|
return true;
|
2019-11-28 19:02:47 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean supportsFindDevice() {
|
2019-11-29 18:01:57 +01:00
|
|
|
return true;
|
2019-11-28 19:02:47 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean supportsActivityDataFetching() {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean supportsActivityTracking() {
|
2020-12-04 16:14:00 +01:00
|
|
|
return true;
|
2019-11-28 19:02:47 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean supportsScreenshots() {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean supportsSmartWakeup(GBDevice device) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean supportsHeartRateMeasurement(GBDevice device) {
|
2020-12-04 16:14:00 +01:00
|
|
|
return true;
|
2019-11-28 19:02:47 +01:00
|
|
|
}
|
2023-01-26 11:31:13 +01:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean supportsManualHeartRateMeasurement(GBDevice device) {
|
|
|
|
/* we could do this, but the current code for onHeartRateTest
|
|
|
|
looks completely broken. There's no way to stop heart rate measurements
|
|
|
|
and it doesn't even appear to care what device it's getting the current
|
|
|
|
heart rate measurements from. Fixing it is too much work so disabling
|
|
|
|
for now.
|
|
|
|
*/
|
|
|
|
return false;
|
|
|
|
}
|
2019-11-28 19:02:47 +01:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public int getAlarmSlotCount() {
|
2019-11-29 18:01:57 +01:00
|
|
|
return 10;
|
2019-11-28 19:02:47 +01:00
|
|
|
}
|
|
|
|
|
2022-06-13 09:35:32 +02:00
|
|
|
@Override
|
|
|
|
public boolean supportsAppsManagement() { return BuildConfig.INTERNET_ACCESS; }
|
|
|
|
|
2019-11-28 19:02:47 +01:00
|
|
|
@Override
|
|
|
|
public Class<? extends Activity> getAppsManagementActivity() {
|
2022-06-13 09:35:32 +02:00
|
|
|
return BuildConfig.INTERNET_ACCESS ? AppsManagementActivity.class : null;
|
2019-11-28 19:02:47 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2019-12-14 12:16:23 +01:00
|
|
|
protected void deleteDevice(@NonNull GBDevice gbDevice, @NonNull Device device, @NonNull DaoSession session) {
|
2019-11-28 19:02:47 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Class<? extends Activity> getPairingActivity() {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public SampleProvider<? extends ActivitySample> getSampleProvider(GBDevice device, DaoSession session) {
|
2020-12-04 16:14:00 +01:00
|
|
|
return new BangleJSSampleProvider(device, session);
|
2019-11-28 19:02:47 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public InstallHandler findInstallHandler(Uri uri, Context context) {
|
|
|
|
return null;
|
|
|
|
}
|
2021-07-06 09:22:52 +02:00
|
|
|
|
2022-06-10 13:01:12 +02:00
|
|
|
@Override
|
|
|
|
public boolean supportsUnicodeEmojis() {
|
|
|
|
/* we say yes here (because we can't get a handle to our device's prefs to check)
|
|
|
|
and then in 'renderUnicodeAsImage' we call EmojiConverter.convertUnicodeEmojiToAscii
|
|
|
|
just like DeviceCommunicationService.sanitizeNotifText would have done if we'd
|
|
|
|
reported false *if* conversion is disabled */
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2021-07-06 09:22:52 +02:00
|
|
|
public int[] getSupportedDeviceSpecificSettings(GBDevice device) {
|
2022-05-18 17:31:22 +02:00
|
|
|
Vector<Integer> settings = new Vector<Integer>();
|
2022-05-18 17:35:07 +02:00
|
|
|
settings.add(R.xml.devicesettings_banglejs);
|
2022-05-18 17:31:22 +02:00
|
|
|
settings.add(R.xml.devicesettings_transliteration);
|
|
|
|
settings.add(R.xml.devicesettings_high_mtu);
|
|
|
|
if (BuildConfig.INTERNET_ACCESS)
|
|
|
|
settings.add(R.xml.devicesettings_device_internet_access);
|
|
|
|
settings.add(R.xml.devicesettings_device_intents);
|
2022-07-18 17:52:26 +02:00
|
|
|
settings.add(R.xml.devicesettings_sync_calendar);
|
2022-05-18 17:31:22 +02:00
|
|
|
// must be a better way of doing this?
|
|
|
|
int[] settingsInt = new int[settings.size()];
|
|
|
|
for (int i=0; i<settings.size(); i++) settingsInt[i] = settings.get(i);
|
|
|
|
return settingsInt;
|
2021-07-06 09:22:52 +02:00
|
|
|
}
|
2023-06-09 09:47:10 +02:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean supportsNavigation() {
|
|
|
|
return true;
|
|
|
|
}
|
2019-11-28 19:02:47 +01:00
|
|
|
}
|