1
0
mirror of https://codeberg.org/Freeyourgadget/Gadgetbridge synced 2024-11-25 11:26:47 +01:00
This commit is contained in:
Daniel Dakhno 2020-03-29 03:11:44 +02:00
commit b290e035f1
27 changed files with 439 additions and 10 deletions

View File

@ -1,4 +1,11 @@
### Changelog
#### Version 0.43.0
* Initial support for Fossil Hybrid HR (needs complicated key extraction, read wiki)
* Fossil: Allow switching off the Q Icon and use the default Gadgetbridge icon
* Fix VoIP call handling during DND
* Fix find-my-phone for Android 10
* Huami: Fix crash when calendar event desctription or title was null
* Huami: Igore all-day events when syncing calendar events
#### Version 0.42.1
* Fix accepting/rejecting calls on Android 9

View File

@ -29,13 +29,14 @@ vendor's servers.
## Supported Devices (Some of them WIP and some of them without maintainer)
* Amazfit Bip [Wiki](https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/Amazfit-Bip)
* Amazfit Bip Lite (NOT RECOMMENDED, NEEDS MI FIT WITH ACCOUNT ONCE) [Wiki](https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/Amazfit-Bip-Lite)
* Amazfit Bip Lite (WARNING: NEEDS MI FIT WITH ACCOUNT ONCE) [Wiki](https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/Amazfit-Bip-Lite)
* Amazfit Cor [Wiki](https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/Amazfit-Cor)
* Amazfit Cor 2 [Wiki](https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/Amazfit-Cor-2)
* Amazfit GTR (NOT RECOMMENDED, NEEDS MI FIT WITH ACCOUNT ONCE) [Wiki](https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/Amazfit-GTR)
* Amazfit GTS (NOT RECOMMENDED, NEEDS MI FIT WITH ACCOUNT ONCE) [Wiki](https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/Amazfit-GTS)
* Amazfit GTR (WARNING: NEEDS MI FIT WITH ACCOUNT ONCE) [Wiki](https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/Amazfit-GTR)
* Amazfit GTS (WARNING: NEEDS MI FIT WITH ACCOUNT ONCE) [Wiki](https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/Amazfit-GTS)
* BFH-16
* Casio GB-6900B
* Fossil Hybrid HR (WARNING: NEEDS FOSSIL APP WITH ACCOUNT ONCE AND COMPLICATED PROCEDURE) [Wiki](https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/Fossil-Hybrid-HR)
* Fossil Q Hybrid
* HPlus Devices (e.g. ZeBand) [Wiki](https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/HPlus)
* iTag
@ -81,7 +82,7 @@ Please see [FEATURES.md](https://codeberg.org/Freeyourgadget/Gadgetbridge/src/ma
* Jean-François Greffier (Mi Scale 2)
* Johannes Schmitt (BFH-16)
* Lukas Schwichtenberg (Makibes HR3)
* Daniel Dakhno (Fossil Q Hybrid)
* Daniel Dakhno (Fossil Q Hybrid, Fossil Hybrid HR)
* Gordon Williams (Bangle.js)
* Pavel Elagin (JYou Y5)
* Taavi Eomäe (iTag)

View File

@ -28,4 +28,6 @@ public class DeviceSettingsPreferenceConst {
public static final String PREF_BUTTON_1_FUNCTION = "button_1_function";
public static final String PREF_BUTTON_2_FUNCTION = "button_2_function";
public static final String PREF_BUTTON_3_FUNCTION = "button_3_function";
public static final String PREF_VIBRATION_STRENGH_PERCENTAGE = "vibration_strength";
public static final String PREF_RELAX_FIRMWARE_CHECKS = "relax_firmware_checks";
}

View File

@ -45,6 +45,7 @@ import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.Dev
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_DATEFORMAT;
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_SCREEN_ORIENTATION;
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_TIMEFORMAT;
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_VIBRATION_STRENGH_PERCENTAGE;
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_WEARLOCATION;
import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF_ACTIVATE_DISPLAY_ON_LIFT;
import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF_DISCONNECT_NOTIFICATION;
@ -319,6 +320,7 @@ public class DeviceSpecificSettingsFragment extends PreferenceFragmentCompat {
addPreferenceHandlerFor(PREF_BUTTON_1_FUNCTION);
addPreferenceHandlerFor(PREF_BUTTON_2_FUNCTION);
addPreferenceHandlerFor(PREF_BUTTON_3_FUNCTION);
addPreferenceHandlerFor(PREF_VIBRATION_STRENGH_PERCENTAGE);
String displayOnLiftState = prefs.getString(PREF_ACTIVATE_DISPLAY_ON_LIFT, PREF_DO_NOT_DISTURB_OFF);
boolean displayOnLiftScheduled = displayOnLiftState.equals(PREF_DO_NOT_DISTURB_SCHEDULED);

View File

@ -26,7 +26,9 @@ import androidx.annotation.NonNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.devices.InstallHandler;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDeviceCandidate;
import nodomain.freeyourgadget.gadgetbridge.model.DeviceType;
@ -63,4 +65,21 @@ public class AmazfitBipLiteCoordinator extends AmazfitBipCoordinator {
public int getBondingStyle() {
return BONDING_STYLE_REQUIRE_KEY;
}
@Override
public int[] getSupportedDeviceSpecificSettings(GBDevice device) {
return new int[]{
R.xml.devicesettings_amazfitbip,
R.xml.devicesettings_timeformat,
R.xml.devicesettings_wearlocation,
R.xml.devicesettings_custom_emoji_font,
R.xml.devicesettings_liftwrist_display,
R.xml.devicesettings_disconnectnotification,
R.xml.devicesettings_sync_calendar,
R.xml.devicesettings_expose_hr_thirdparty,
R.xml.devicesettings_buttonactions_with_longpress,
R.xml.devicesettings_pairingkey,
R.xml.devicesettings_relax_firmware_checks,
};
}
}

View File

@ -0,0 +1,99 @@
/* Copyright (C) 2017-2020 Andreas Shimokawa, Carsten Pfeiffer, Daniele
Gobbetti, João Paulo Barraca, Nephiel, vanous
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/>. */
package nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitbips;
import android.bluetooth.BluetoothDevice;
import android.content.Context;
import android.net.Uri;
import androidx.annotation.NonNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.devices.InstallHandler;
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiCoordinator;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDeviceCandidate;
import nodomain.freeyourgadget.gadgetbridge.model.DeviceType;
public class AmazfitBipSCoordinator extends HuamiCoordinator {
private static final Logger LOG = LoggerFactory.getLogger(AmazfitBipSCoordinator.class);
@Override
public DeviceType getDeviceType() {
return DeviceType.AMAZFITBIPS;
}
@NonNull
@Override
public DeviceType getSupportedType(GBDeviceCandidate candidate) {
try {
BluetoothDevice device = candidate.getDevice();
String name = device.getName();
if (name != null && (name.equalsIgnoreCase("Amazfit Bip S"))) {
return DeviceType.AMAZFITBIPS;
}
} catch (Exception ex) {
LOG.error("unable to check device support", ex);
}
return DeviceType.UNKNOWN;
}
@Override
public InstallHandler findInstallHandler(Uri uri, Context context) {
return null;
}
@Override
public boolean supportsHeartRateMeasurement(GBDevice device) {
return true;
}
@Override
public boolean supportsActivityTracks() {
return true;
}
@Override
public boolean supportsWeather() {
return true;
}
@Override
public int[] getSupportedDeviceSpecificSettings(GBDevice device) {
return new int[]{
R.xml.devicesettings_amazfitbip,
R.xml.devicesettings_timeformat,
R.xml.devicesettings_wearlocation,
R.xml.devicesettings_custom_emoji_font,
R.xml.devicesettings_liftwrist_display,
R.xml.devicesettings_disconnectnotification,
R.xml.devicesettings_sync_calendar,
R.xml.devicesettings_expose_hr_thirdparty,
R.xml.devicesettings_buttonactions_with_longpress,
R.xml.devicesettings_pairingkey
};
}
@Override
public int getBondingStyle() {
return BONDING_STYLE_REQUIRE_KEY;
}
}

View File

@ -43,6 +43,7 @@ public enum DeviceType {
AMAZFITBIP_LITE(17, R.drawable.ic_device_hplus, R.drawable.ic_device_hplus_disabled, R.string.devicetype_amazfit_bip_lite),
AMAZFITGTR(18, R.drawable.ic_device_hplus, R.drawable.ic_device_hplus_disabled, R.string.devicetype_amazfit_gtr),
AMAZFITGTS(19, R.drawable.ic_device_hplus, R.drawable.ic_device_hplus_disabled, R.string.devicetype_amazfit_gts),
AMAZFITBIPS(20, R.drawable.ic_device_hplus, R.drawable.ic_device_hplus_disabled, R.string.devicetype_amazfit_bips),
LIVEVIEW(30, R.drawable.ic_device_default, R.drawable.ic_device_default_disabled, R.string.devicetype_liveview),
HPLUS(40, R.drawable.ic_device_hplus, R.drawable.ic_device_hplus_disabled, R.string.devicetype_hplus),
MAKIBESF68(41, R.drawable.ic_device_hplus, R.drawable.ic_device_hplus_disabled, R.string.devicetype_makibes_f68),

View File

@ -36,6 +36,7 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.casiogb6900.CasioGB6
import nodomain.freeyourgadget.gadgetbridge.service.devices.hplus.HPlusSupport;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.HuamiSupport;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.amazfitbip.AmazfitBipLiteSupport;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.amazfitbip.AmazfitBipSSupport;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.amazfitbip.AmazfitBipSupport;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.amazfitgtr.AmazfitGTRSupport;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.amazfitcor.AmazfitCorSupport;
@ -148,6 +149,9 @@ public class DeviceSupportFactory {
case AMAZFITBIP_LITE:
deviceSupport = new ServiceDeviceSupport(new AmazfitBipLiteSupport(), EnumSet.of(ServiceDeviceSupport.Flags.BUSY_CHECKING));
break;
case AMAZFITBIPS:
deviceSupport = new ServiceDeviceSupport(new AmazfitBipSSupport(), EnumSet.of(ServiceDeviceSupport.Flags.BUSY_CHECKING));
break;
case AMAZFITGTR:
deviceSupport = new ServiceDeviceSupport(new AmazfitGTRSupport(), EnumSet.of(ServiceDeviceSupport.Flags.BUSY_CHECKING));
break;

View File

@ -1697,6 +1697,9 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
int iteration = 0;
for (CalendarEvents.CalendarEvent mEvt : mEvents) {
if (mEvt.isAllDay()) {
continue;
}
if (iteration >= availableSlots || iteration > 2) {
break;
}
@ -1724,6 +1727,10 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
int iteration = 0;
for (CalendarEvents.CalendarEvent calendarEvent : calendarEvents) {
if (calendarEvent.isAllDay()) {
continue;
}
if (iteration > 8) { // limit ?
break;
}

View File

@ -19,11 +19,14 @@ package nodomain.freeyourgadget.gadgetbridge.service.devices.huami.amazfitbip;
import java.util.HashMap;
import java.util.Map;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
import nodomain.freeyourgadget.gadgetbridge.model.DeviceType;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.HuamiFirmwareInfo;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.HuamiFirmwareType;
import nodomain.freeyourgadget.gadgetbridge.util.ArrayUtils;
import nodomain.freeyourgadget.gadgetbridge.util.Prefs;
public class AmazfitBipLiteFirmwareInfo extends HuamiFirmwareInfo {
@ -66,6 +69,15 @@ public class AmazfitBipLiteFirmwareInfo extends HuamiFirmwareInfo {
if (searchString32BitAligned(bytes, "Amazfit Bip Lite")) {
return HuamiFirmwareType.FIRMWARE;
}
GBDevice device = GBApplication.app().getDeviceManager().getSelectedDevice();
if (device != null) {
Prefs prefs = new Prefs(GBApplication.getDeviceSpecificSharedPrefs(device.getAddress()));
if (prefs.getBoolean(DeviceSettingsPreferenceConst.PREF_RELAX_FIRMWARE_CHECKS, false)) {
if (searchString32BitAligned(bytes, "Amazfit Bip")) {
return HuamiFirmwareType.FIRMWARE;
}
}
}
return HuamiFirmwareType.INVALID;
}
if (ArrayUtils.startsWith(bytes, WATCHFACE_HEADER)) {

View File

@ -0,0 +1,48 @@
/* Copyright (C) 2017-2020 Andreas Shimokawa, Carsten Pfeiffer
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/>. */
package nodomain.freeyourgadget.gadgetbridge.service.devices.huami.amazfitbip;
import android.content.Context;
import android.net.Uri;
import java.io.IOException;
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiFWHelper;
import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
public class AmazfitBipSSupport extends AmazfitBipSupport {
@Override
public byte getCryptFlags() {
return (byte) 0x80;
}
@Override
public void onNotification(NotificationSpec notificationSpec) {
super.sendNotificationNew(notificationSpec, true);
}
@Override
protected byte getAuthFlags() {
return 0x00;
}
@Override
public HuamiFWHelper createFWHelper(Uri uri, Context context) throws IOException {
return null;
}
}

View File

@ -106,7 +106,7 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter {
loadNotificationConfigurations();
queueWrite(new NotificationFilterPutHRRequest(this.notificationConfigurations, this));
setVibrationStrength((short) 75);
setVibrationStrength();
syncSettings();
@ -123,6 +123,15 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter {
queueWrite(new SetDeviceStateRequest(GBDevice.State.INITIALIZED));
}
private void setVibrationStrength() {
Prefs prefs = new Prefs(getDeviceSpecificPreferences());
int vibrationStrengh = prefs.getInt(DeviceSettingsPreferenceConst.PREF_VIBRATION_STRENGH_PERCENTAGE, 2);
if (vibrationStrengh > 0) {
vibrationStrengh = (vibrationStrengh + 1) * 25; // Seems 0,50,75,100 are working...
}
setVibrationStrength((short) (vibrationStrengh));
}
@Override
public void setVibrationStrength(short strength) {
negotiateSymmetricKey();
@ -692,6 +701,9 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter {
case DeviceSettingsPreferenceConst.PREF_BUTTON_2_FUNCTION:
case DeviceSettingsPreferenceConst.PREF_BUTTON_3_FUNCTION:
overwriteButtons(null);
break;
case DeviceSettingsPreferenceConst.PREF_VIBRATION_STRENGH_PERCENTAGE:
setVibrationStrength();
}
}

View File

@ -19,6 +19,7 @@ package nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fo
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.zip.CRC32;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.adapter.fossil.FossilWatchAdapter;
@ -57,7 +58,9 @@ public abstract class PlayNotificationRequest extends FilePutRequest {
byte[] senderBytes = nullTerminatedSender.getBytes(charsetUTF8);
String nullTerminatedMessage = StringUtils.terminateNull(message);
byte[] messageBytes = nullTerminatedMessage.getBytes(charsetUTF8);
if (messageBytes.length > 490) {
messageBytes = Arrays.copyOf(messageBytes, 490);
}
short mainBufferLength = (short) (lengthBufferLength + uidLength + appBundleCRCLength + titleBytes.length + senderBytes.length + messageBytes.length);
ByteBuffer mainBuffer = ByteBuffer.allocate(mainBufferLength);

View File

@ -48,6 +48,7 @@ import nodomain.freeyourgadget.gadgetbridge.devices.hplus.EXRIZUK8Coordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.hplus.HPlusCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.hplus.MakibesF68Coordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitbip.AmazfitBipLiteCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitbips.AmazfitBipSCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitgtr.AmazfitGTRCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitgts.AmazfitGTSCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.itag.ITagCoordinator;
@ -216,6 +217,7 @@ public class DeviceHelper {
result.add(new AmazfitCor2Coordinator());
result.add(new AmazfitGTRCoordinator());
result.add(new AmazfitGTSCoordinator());
result.add(new AmazfitBipSCoordinator());
result.add(new MiBand3Coordinator());
result.add(new MiBand4Coordinator());
result.add(new MiBand2HRXCoordinator());

View File

@ -335,7 +335,7 @@
<string name="mi2_prefs_button_actions">Accions del botó</string>
<string name="mi2_prefs_button_actions_summary">Especifiqueu les accions en prémer el botó</string>
<string name="mi2_prefs_button_press_count">Nombre de pulsacions del botó</string>
<string name="mi2_prefs_button_press_count_summary">Nombre de vegades que cal prémer el botó per activar la difusió de missatge</string>
<string name="mi2_prefs_button_press_count_summary">Nombre de vegades que cal prémer el botó per activar un Esdeveniment 1. Després, prémer el mateix nombre de vegades crearà un Esdeveniment 2, i successivament.</string>
<string name="mi2_prefs_button_press_broadcast">Missatge de difusió a enviar</string>
<string name="mi2_prefs_button_action">Activa el botó d\'acció</string>
<string name="mi2_prefs_button_action_summary">Activa un acció en prémer un botó un cert nombre de vegades</string>
@ -347,7 +347,7 @@
<string name="mi2_prefs_goal_notification">Notificació d\'objectiu</string>
<string name="mi2_prefs_goal_notification_summary">La polsera vibrarà quan l\'objectiu diari de passes siga assolit</string>
<string name="mi2_prefs_display_items">Elements a mostrar</string>
<string name="mi2_prefs_display_items_summary">Escolliu els elements a mostrar en la pantalla de la polsera</string>
<string name="mi2_prefs_display_items_summary">Escolliu els elements a mostrar a la pantalla de la polsera</string>
<string name="mi2_prefs_activate_display_on_lift">Activa la pantalla en alçar-la</string>
<string name="mi2_prefs_rotate_wrist_to_switch_info">Gira el canell per canviar la informació</string>
<string name="mi2_prefs_do_not_disturb">No molesteu</string>
@ -437,7 +437,7 @@
<string name="pref_title_dont_ack_transfer">No enviïs l\'ACK de les dades d\'activitats</string>
<string name="pref_summary_dont_ack_transfers">Si l\'arribada de les dades d\'activitats no és notificada a la polsera, aquestes dades no s\'eliminaran. Aquesta opció pot ser útil si feu servir el Gadgebridge també amb altres aplicacions.</string>
<string name="pref_summary_keep_data_on_device">Les dades d\'activitats de la Mi Band es guardaran fins i tot després de sincronitzar. Aquesta opció pot ser útil si feu servir el Gadgebridge també amb altres aplicacions.</string>
<string name="mi2_prefs_button_press_broadcast_summary">Messatge que s\'enviarà quan s\'hagi premut el botó el nombre de vegades establert</string>
<string name="mi2_prefs_button_press_broadcast_summary">Difón el missatge enviat amb l\'esdeveniment. El paràmetre `button_id` és afegit automàticament a cada missatge.</string>
<string name="mi2_prefs_button_press_count_match_delay_summary">Retard després d\'una acció de botó (el nombre és a l\'intent extra de button_id) o 0 per procedir immediatament</string>
<string name="pref_title_pebble_health_store_raw">Desa dades sense processar a la base de dades</string>
<string name="pref_summary_pebble_health_store_raw">Desa les dades \"tal qual\", tot augmentant l\'ús de la base de dades per tal de permetre possibles interpretacions més tard.</string>
@ -793,4 +793,56 @@
<string name="prefs_find_phone_summary">Fes servir la teva banda per a reproduir el to del telèfon.</string>
<string name="discovery_need_to_enter_authkey">Aquest aparell requereix una clau d\'autenticació secreta, mantingueu premut sobre l\'aparell per a introduir-la. Consulteu la wiki.</string>
<string name="pref_summary_allow_high_mtu">Augmenta la velocitat de transferència, però pot ser que no funcioni en alguns aparells Android.</string>
<string name="devicetype_qhybrid">Fossil Q Hybrid</string>
<string name="preferences_qhybrid_settings">Configuració de Q Hybrid</string>
<string name="watch_not_connected">Rellotge no connectat</string>
<string name="qhybrid_vibration_strength">intensitat de vibració:</string>
<string name="qhybrid_goal_in_steps">Objectiu en passes</string>
<string name="qhybrid_time_shift">decalat horari</string>
<string name="qhybrid_second_timezone_offset_relative_to_utc">decalat del segon fus horari relatiu a UTC</string>
<string name="qhybrid_overwrite_buttons">sobreescriu els botons</string>
<string name="qhybrid_use_activity_hand_as_notification_counter">utilitza la maneta d\'activitat com a comptador de notificacions</string>
<string name="qhybrid_prompt_million_steps">Si us plau, estableix el comptador de passes a un milió per a activar-ho.</string>
<string name="qhybrid_buttons_overwrite_success">Botons sobreescrits</string>
<string name="qhybrid_buttons_overwrite_error">Error al sobreescriure botons</string>
<string name="qhybrid_offset_timezone">decala el fus horari en</string>
<string name="qhybrid_changes_delay_prompt">el canvi pot trigar uns segons…</string>
<string name="qhybrid_offset_time_by">temps decalat en</string>
<string name="pref_disable_new_ble_scanning">Desactiva el nou escaneig BLE</string>
<string name="pref_summary_disable_new_ble_scanning">Marca aquesta opció si el teu aparell no pot ser trobat durant la detecció</string>
<string name="devicetype_banglejs">Bangle.js</string>
<string name="devicetype_y5">Y5</string>
<string name="prefs_button_single_press_action_selection_title">Acció d\'esdeveniment 1</string>
<string name="prefs_button_double_press_action_selection_title">Acció d\'esdeveniment 2</string>
<string name="prefs_button_triple_press_action_selection_title">Acció d\'esdeveniment 3</string>
<string name="prefs_button_variable_actions">Configuració detallada de premuda de botó</string>
<string name="prefs_button_long_press_action_selection_title">Acció de premuda llarga de botó</string>
<string name="alarm_snooze">Posposa</string>
<string name="error_no_location_access">S\'ha de permetre i activar l\'accés a la localitztació per al correcte funcionament de l\'escaneig</string>
<string name="devicetype_itag">iTag</string>
<string name="pref_title_allow_high_mtu">Permet una alta MTU</string>
<string name="pref_summary_sync_calendar">Activa les alertes de calendari, fins i tot quan estigui desconnectat</string>
<string name="pref_title_sync_caldendar">Sincronitza els esdeveniments del calendari</string>
<string name="hr_widget_heart_rate">Ritme cardíac</string>
<string name="hr_widget_steps">Passes</string>
<string name="hr_widget_date">Data</string>
<string name="hr_widget_active_minutes">Minuts actius</string>
<string name="hr_widget_calories">Calories</string>
<string name="hr_widget_battery">Bateria</string>
<string name="hr_widget_weather">El temps</string>
<string name="hr_widget_nothing">Res</string>
<string name="find_lost_device_you_found_it">Trobat!</string>
<string name="pref_title_force_white_color_scheme">Força l\'esquema de color blanc sobre negre</string>
<string name="pref_summary_force_white_color_scheme">Útil si si el teu rellotge té les manetes negres</string>
<string name="find_my_phone_notification">Troba el meu telèfon</string>
<string name="notification_channel_high_priority_name">Notificacions de Gadgetbridge d\'alta prioritat</string>
<string name="pref_title_custom_deviceicon">Mostra l\'icona de notificació específica de l\'aparell</string>
<string name="pref_summary_custom_deviceicon">Mostra l\'icona de notificació d\'Android específica de l\'aparell enlloc de l\'icona de Gadgetbridge quan estigui connectat</string>
<string name="hr_appname_wellness">Benestar</string>
<string name="hr_appname_workout">Entrenament</string>
<string name="hr_appname_stopwatch">Cronòmetre</string>
<string name="hr_appname_commute">Desplçament</string>
<string name="pref_title_upper_button_function">Botó superior</string>
<string name="pref_title_middle_button_function">Botó mitger</string>
<string name="pref_title_lower_button_function">Botó inferior</string>
</resources>

View File

@ -845,4 +845,14 @@
<string name="find_lost_device_you_found_it">Gefunden!</string>
<string name="pref_title_force_white_color_scheme">Schwarz-Weiß-Farbschema erzwingen</string>
<string name="pref_summary_force_white_color_scheme">Nützlich, wenn deine Uhr dunkle Zeiger hat</string>
<string name="find_my_phone_notification">Mein Telefon finden</string>
<string name="notification_channel_high_priority_name">Gadgetbridge-Benachrichtigungen mit hoher Priorität</string>
<string name="pref_title_custom_deviceicon">Gerätespezifisches Benachrichtigungssymbol anzeigen</string>
<string name="pref_summary_custom_deviceicon">Zeige ein gerätespezifisches Android-Benachrichtigungssymbol anstelle des Gadgetbridge-Symbols, wenn eine Verbindung besteht</string>
<string name="hr_appname_wellness">Wellness</string>
<string name="hr_appname_workout">Training</string>
<string name="hr_appname_stopwatch">Stoppuhr</string>
<string name="pref_title_upper_button_function">Obere Taste</string>
<string name="pref_title_middle_button_function">Mittlere Taste</string>
<string name="pref_title_lower_button_function">Untere Taste</string>
</resources>

View File

@ -838,4 +838,15 @@
<string name="find_lost_device_you_found_it">מצאתי!</string>
<string name="pref_title_force_white_color_scheme">לאכוף ערכת צבעים שחור על לבן</string>
<string name="pref_summary_force_white_color_scheme">שימושי לידיים כהות</string>
<string name="find_my_phone_notification">איתור הטלפון שלי</string>
<string name="notification_channel_high_priority_name">התראות מ־Gadgetbridge בעדיפות גבוהה</string>
<string name="pref_title_custom_deviceicon">הצגת סמל התראה ייעודי למכשיר</string>
<string name="pref_summary_custom_deviceicon">הצגת התראת Android תואמת מכשיר במקום הסמל של Gadgetbridge כשיש חיבור</string>
<string name="hr_appname_wellness">רווחה</string>
<string name="hr_appname_workout">אימון</string>
<string name="hr_appname_stopwatch">שעון עצר</string>
<string name="hr_appname_commute">התניידות</string>
<string name="pref_title_upper_button_function">כפתור עליון</string>
<string name="pref_title_middle_button_function">כפתור אמצעי</string>
<string name="pref_title_lower_button_function">כפתור תחתון</string>
</resources>

View File

@ -836,4 +836,15 @@
<string name="find_lost_device_you_found_it">Gevonden!</string>
<string name="pref_title_force_white_color_scheme">Zwart op wit kleurenschema forceren</string>
<string name="pref_summary_force_white_color_scheme">Nuttig als je horloge donkere wijzers heeft</string>
<string name="find_my_phone_notification">Vind mijn telefoon</string>
<string name="notification_channel_high_priority_name">Gadgetbridge hoge prioriteit meldingen</string>
<string name="pref_title_custom_deviceicon">Toon apparaat specifieke meldingspictogram</string>
<string name="pref_summary_custom_deviceicon">Toon een apparaatspecifiek Android-meldpictogram in plaats van het Gadgetbridge-pictogram indien verbonden</string>
<string name="hr_appname_wellness">Welzijn</string>
<string name="hr_appname_workout">Training</string>
<string name="hr_appname_stopwatch">Stopwatch</string>
<string name="hr_appname_commute">Woon-werkverkeer</string>
<string name="pref_title_upper_button_function">Bovenste knop</string>
<string name="pref_title_middle_button_function">Middelste knop</string>
<string name="pref_title_lower_button_function">Onderste knop</string>
</resources>

View File

@ -848,4 +848,15 @@
<string name="find_lost_device_you_found_it">Encontrei!</string>
<string name="pref_title_force_white_color_scheme">Forçar preto no esquema de cores branco</string>
<string name="pref_summary_force_white_color_scheme">Útil se seu relógio possui ponteiros escuros</string>
<string name="find_my_phone_notification">Localizar meu telefone</string>
<string name="notification_channel_high_priority_name">Notificações de Gadgetbridge de alta prioridade</string>
<string name="pref_title_custom_deviceicon">Mostrar ícone de notificação específica do dispositivo</string>
<string name="pref_summary_custom_deviceicon">Mostra o ícone de notificação Android específico de um dispositivo em vez do ícone do Gadgetbridge quando conectado</string>
<string name="hr_appname_wellness">Bem-estar</string>
<string name="hr_appname_workout">Treino</string>
<string name="hr_appname_stopwatch">Cronômetro</string>
<string name="hr_appname_commute">Comutar</string>
<string name="pref_title_upper_button_function">Botão superior</string>
<string name="pref_title_middle_button_function">Botão do meio</string>
<string name="pref_title_lower_button_function">Botão inferior</string>
</resources>

View File

@ -823,4 +823,9 @@
<string name="devicetype_itag">iTag</string>
<string name="pref_title_allow_high_mtu">Разрешить высокий MTU</string>
<string name="pref_summary_allow_high_mtu">Увеличивает скорость передачи данных, но может не работать на некоторых Android-устройствах.</string>
<string name="pref_summary_sync_calendar">Включает уведомления календаря, даже когда отключено</string>
<string name="pref_title_sync_caldendar">Синхронизировать события в календаре</string>
<string name="find_my_phone_notification">Найти телефон</string>
<string name="pref_title_custom_deviceicon">Показывать собственную иконку устройства</string>
<string name="pref_summary_custom_deviceicon">При подключении показывать в уведомлении собственную иконку устройства вместо иконки Gadgetbridge</string>
</resources>

View File

@ -838,4 +838,13 @@
<string name="pref_summary_force_white_color_scheme">如果您双手颜色较深,将会有帮助</string>
<string name="find_my_phone_notification">查找我的手机</string>
<string name="notification_channel_high_priority_name">Gadgetbridge 通知高优先级</string>
<string name="pref_title_custom_deviceicon">显示设备特定的通知图标</string>
<string name="pref_summary_custom_deviceicon">显示设备指定的 Android 通知图标以替代已连接时的 Gadgetbridge 图标</string>
<string name="hr_appname_wellness">健康</string>
<string name="hr_appname_workout">健身</string>
<string name="hr_appname_stopwatch">秒表</string>
<string name="hr_appname_commute">通勤</string>
<string name="pref_title_upper_button_function">上按钮</string>
<string name="pref_title_middle_button_function">中按钮</string>
<string name="pref_title_lower_button_function">下按钮</string>
</resources>

View File

@ -401,4 +401,71 @@
<string name="fw_upgrade_notice">您即將安裝 %s。</string>
<string name="notif_battery_low_title">裝置電量不足!</string>
<string name="notif_battery_low_percent">%1$s 電量剩餘:%2$s%%</string>
<string name="pref_title_location_longitude">經度</string>
<string name="pref_title_screentime">螢幕逾時</string>
<string name="zetime_title_screentime">螢幕逾時(秒)</string>
<string name="activity_prefs_alarm_min_heart_rate">最低心率</string>
<string name="test">測試</string>
<string name="cannot_connect_bt_address_invalid_">無法連線。藍芽位址無效?</string>
<string name="n_a">不適用</string>
<string name="pairing">正在與 %s 配對…</string>
<string name="message_cannot_pair_no_mac">未輸入 MAC 位址,無法配對。</string>
<string name="miband_pairing_using_dummy_userdata">未提供有效的使用者資料,目前使用假定資料。</string>
<string name="discovery_connected_devices_hint">請確認您的裝置可以被偵測到。已連接的裝置將無法被偵測。請在 Android 6 以上的裝置啟用位置權限GPS。請對 Gadgetbridge 停用隱私守衛,因為這可能會導致您的手機崩潰並重新啟動。如果在數分鐘後仍未找到任何裝置,請重新啟動您的手機並再試一次。</string>
<string name="discovery_note">備註:</string>
<string name="initializing">正在初始化</string>
<string name="pref_screen_notification_profile_low_power">低電量警告</string>
<string name="control_center_cancel_to_stop_vibration">取消以停止振動。</string>
<string name="notif_battery_low_bigtext_last_charge_time">上次充電:%s
\n</string>
<string name="notif_export_failed_title">匯出資料庫失敗!請檢查您的設定值。</string>
<string name="updatefirmwareoperation_update_complete">韌體安裝完成</string>
<string name="updatefirmwareoperation_update_complete_rebooting">韌體安裝完成,正在重啟裝置…</string>
<string name="chart_steps">步數</string>
<string name="calories">卡路里</string>
<string name="distance">距離</string>
<string name="prefs_find_phone">尋找手機</string>
<string name="updatefirmwareoperation_update_in_progress">正在安裝韌體</string>
<string name="dbmanagementactivity_import_data_title">您確定要匯入資料?</string>
<string name="dbmanagementactivity_error_importing_db">匯入資料庫時發生錯誤:%1$s</string>
<string name="dbmanagementactivity_database_successfully_deleted">資料已刪除。</string>
<string name="activity_db_management_autoexport_explanation">資料庫的自動匯出位置已設定為:</string>
<string name="activity_db_management_autoexport_label">自動匯出</string>
<string name="activity_DB_test_export_button">立即執行自動匯出</string>
<string name="activity_DB_test_export_message">正在匯出資料庫…</string>
<string name="Cancel">取消</string>
<string name="Delete">刪除</string>
<string name="discovery_yes_pair">配對</string>
<string name="activity_type_exercise">運動</string>
<string name="kind_gps_cep">GPS 誤差校正</string>
<string name="kind_resources">資源包</string>
<string name="devicetype_unknown">未知的裝置</string>
<string name="devicetype_test">測試用裝置</string>
<string name="menuitem_shortcut_alipay">支付寶(捷徑)</string>
<string name="menuitem_alarm">鬧鐘</string>
<string name="menuitem_alipay">支付寶</string>
<string name="title_activity_notification_filter">通知過濾</string>
<string name="edittext_notification_filter_words_hint">輸入要進行比對的字,使用換行作為分隔</string>
<string name="toast_notification_filter_saved_successfully">通知過濾已儲存</string>
<string name="filter_mode_none">不過濾</string>
<string name="filter_mode_whitelist">在包含這些字時顯示</string>
<string name="filter_mode_blacklist">在包含這些字時隱藏</string>
<string name="filter_submode_at_least_one">部份符合</string>
<string name="filter_submode_all">完全符合</string>
<string name="toast_notification_filter_words_empty_hint">請至少輸入一個字</string>
<string name="filter_mode">過濾模式</string>
<string name="mode_configuration">模式設定</string>
<string name="add_widget">新增小工具</string>
<string name="alarm_snooze">貪睡</string>
<string name="pref_title_allow_high_mtu">允許較高的 MTU 值</string>
<string name="pref_summary_allow_high_mtu">提高傳送速度,但可能無法在某些 Android 裝置上使用。</string>
<string name="pref_summary_sync_calendar">啟用日曆事件通知,即便在未連線時</string>
<string name="pref_title_sync_caldendar">同步日曆事件</string>
<string name="hr_widget_heart_rate">心率</string>
<string name="hr_widget_steps">步數</string>
<string name="hr_widget_date">日期</string>
<string name="hr_widget_battery">電量</string>
<string name="hr_widget_weather">天氣</string>
<string name="find_lost_device_you_found_it">找到了!</string>
<string name="find_my_phone_notification">尋找我的手機</string>
</resources>

View File

@ -186,6 +186,9 @@
<string name="pref_summary_allow_high_mtu">Increases transfer speed, but might not work on some Android devices.</string>
<string name="pref_summary_sync_calendar">Enables calendar alerts, even when disconnected</string>
<string name="pref_title_sync_caldendar">Sync calendar events</string>
<string name="pref_summary_relax_firmware_checks">Relax firmware checks</string>
<string name="pref_title_relax_firmware_checks">Enable this if you want to flash a firmware not intended for you device (at your own risk)</string>
<string name="pref_title_vibration_strength">Vibration strength</string>
<string name="pref_display_add_device_fab">Connect new device button</string>
<string name="pref_display_add_device_fab_on">Always visible</string>
<string name="pref_display_add_device_fab_off">Visible only if no device is added</string>
@ -678,6 +681,7 @@
<string name="devicetype_amazfit_cor">Amazfit Cor</string>
<string name="devicetype_amazfit_cor2">Amazfit Cor 2</string>
<string name="devicetype_amazfit_gtr">Amazfit GTR</string>
<string name="devicetype_amazfit_bips">Amazfit Bip S</string>
<string name="devicetype_vibratissimo">Vibratissimo</string>
<string name="devicetype_liveview">LiveView</string>
<string name="devicetype_hplus">HPlus</string>

View File

@ -1,5 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<changelog>
<release version="0.43.0" versioncode="169">
<change>Initial support for Fossil Hybrid HR (needs complicated key extraction, read wiki)</change>
<change>Fossil: Allow switching off the Q Icon and use the default Gadgetbridge icon</change>
<change>Fix VoIP call handling during DND</change>
<change>Fix find-my-phone for Android 10</change>
<change>Huami: Fix crash when calendar event desctription or title was null</change>
<change>Huami: Igore all-day events when syncing calendar events</change>
</release>
<release version="0.42.1" versioncode="168">
<change>Fix accepting/rejecting calls on Android 9</change>
<change>Mi Band 3/4, Amazfit Bip/Cor/GTS/GTR: Option to sync calender events as reminder</change>

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<ListPreference
android:defaultValue="weatherApp"
android:entries="@array/pref_hybridhr_buttonfunctions"
@ -26,4 +27,11 @@
android:key="force_white_color_scheme"
android:summary="@string/pref_summary_force_white_color_scheme"
android:title="@string/pref_title_force_white_color_scheme" />
<SeekBarPreference
android:defaultValue="2"
android:key="@string/pref_title_vibration_strength"
android:max="3"
android:title="@string/pref_title_vibration_strength"
app:showSeekBarValue="true" />
</androidx.preference.PreferenceScreen>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<SwitchPreference
android:defaultValue="false"
android:key="relax_firmware_checks"
android:summary="@string/pref_summary_relax_firmware_checks"
android:title="@string/pref_title_relax_firmware_checks" />
</androidx.preference.PreferenceScreen>

View File

@ -0,0 +1,6 @@
* Initial support for Fossil Hybrid HR (needs complicated key extraction, read wiki)
* Fossil: Allow switching off the Q Icon and use the default Gadgetbridge icon
* Fix VoIP call handling during DND
* Fix find-my-phone for Android 10
* Huami: Fix crash when calendar event desctription or title was null
* Huami: Igore all-day events when syncing calendar events