1
0
mirror of https://codeberg.org/Freeyourgadget/Gadgetbridge synced 2024-11-29 05:16:51 +01:00
This commit is contained in:
mamutcho 2020-03-22 19:42:08 +02:00
commit c4ca247524
25 changed files with 342 additions and 14 deletions

View File

@ -1,4 +1,11 @@
### Changelog ### 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 #### Version 0.42.1
* Fix accepting/rejecting calls on Android 9 * Fix accepting/rejecting calls on Android 9

View File

@ -25,4 +25,8 @@ public class DeviceSettingsPreferenceConst {
public static final String PREF_ALLOW_HIGH_MTU = "allow_high_mtu"; public static final String PREF_ALLOW_HIGH_MTU = "allow_high_mtu";
public static final String PREF_SYNC_CALENDAR = "sync_calendar"; public static final String PREF_SYNC_CALENDAR = "sync_calendar";
public static final String PREF_USE_CUSTOM_DEVICEICON = "use_custom_deviceicon"; public static final String PREF_USE_CUSTOM_DEVICEICON = "use_custom_deviceicon";
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";
} }

View File

@ -39,9 +39,13 @@ import nodomain.freeyourgadget.gadgetbridge.util.Prefs;
import nodomain.freeyourgadget.gadgetbridge.util.XTimePreference; import nodomain.freeyourgadget.gadgetbridge.util.XTimePreference;
import nodomain.freeyourgadget.gadgetbridge.util.XTimePreferenceFragment; import nodomain.freeyourgadget.gadgetbridge.util.XTimePreferenceFragment;
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_BUTTON_1_FUNCTION;
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_BUTTON_2_FUNCTION;
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_BUTTON_3_FUNCTION;
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_DATEFORMAT; 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_SCREEN_ORIENTATION;
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_TIMEFORMAT; 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.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_ACTIVATE_DISPLAY_ON_LIFT;
import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF_DISCONNECT_NOTIFICATION; import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF_DISCONNECT_NOTIFICATION;
@ -313,6 +317,10 @@ public class DeviceSpecificSettingsFragment extends PreferenceFragmentCompat {
addPreferenceHandlerFor(PREF_WEARLOCATION); addPreferenceHandlerFor(PREF_WEARLOCATION);
addPreferenceHandlerFor(PREF_SCREEN_ORIENTATION); addPreferenceHandlerFor(PREF_SCREEN_ORIENTATION);
addPreferenceHandlerFor(PREF_TIMEFORMAT); addPreferenceHandlerFor(PREF_TIMEFORMAT);
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); String displayOnLiftState = prefs.getString(PREF_ACTIVATE_DISPLAY_ON_LIFT, PREF_DO_NOT_DISTURB_OFF);
boolean displayOnLiftScheduled = displayOnLiftState.equals(PREF_DO_NOT_DISTURB_SCHEDULED); boolean displayOnLiftScheduled = displayOnLiftState.equals(PREF_DO_NOT_DISTURB_SCHEDULED);

View File

@ -79,7 +79,7 @@ public class QHybridCoordinator extends AbstractDeviceCoordinator {
@Override @Override
public boolean supportsActivityDataFetching() { public boolean supportsActivityDataFetching() {
return false; return true;
} }
@Override @Override

View File

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

View File

@ -330,6 +330,12 @@ public class QHybridSupport extends QHybridBaseSupport {
this.watchAdapter.onSetAlarms(alarms); this.watchAdapter.onSetAlarms(alarms);
} }
@Override
public void onSendConfiguration(String config) {
if (watchAdapter != null) {
watchAdapter.onSendConfiguration(config);
}
}
private void loadTimeOffset() { private void loadTimeOffset() {
timeOffset = getContext().getSharedPreferences(getContext().getPackageName(), Context.MODE_PRIVATE).getInt("QHYBRID_TIME_OFFSET", 0); timeOffset = getContext().getSharedPreferences(getContext().getPackageName(), Context.MODE_PRIVATE).getInt("QHYBRID_TIME_OFFSET", 0);
} }

View File

@ -85,6 +85,8 @@ public abstract class WatchAdapter {
public abstract void onSetAlarms(ArrayList<? extends Alarm> alarms); public abstract void onSetAlarms(ArrayList<? extends Alarm> alarms);
public abstract void onSendConfiguration(String config);
public abstract boolean onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic); public abstract boolean onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic);
public void onMtuChanged(BluetoothGatt gatt, int mtu, int status){}; public void onMtuChanged(BluetoothGatt gatt, int mtu, int status){};

View File

@ -151,7 +151,7 @@ public class FossilWatchAdapter extends WatchAdapter {
} }
} }
private SharedPreferences getDeviceSpecificPreferences(){ protected SharedPreferences getDeviceSpecificPreferences(){
return GBApplication.getDeviceSpecificSharedPrefs( return GBApplication.getDeviceSpecificSharedPrefs(
getDeviceSupport().getDevice().getAddress() getDeviceSupport().getDevice().getAddress()
); );
@ -456,6 +456,11 @@ public class FossilWatchAdapter extends WatchAdapter {
}); });
} }
@Override
public void onSendConfiguration(String config) {
}
@Override @Override
public boolean onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) { public boolean onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
switch (characteristic.getUuid().toString()) { switch (characteristic.getUuid().toString()) {

View File

@ -26,6 +26,7 @@ import java.util.TimeZone;
import java.util.UUID; import java.util.UUID;
import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst;
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventCallControl; import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventCallControl;
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventFindPhone; import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventFindPhone;
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventMusicControl; import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventMusicControl;
@ -105,7 +106,7 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter {
loadNotificationConfigurations(); loadNotificationConfigurations();
queueWrite(new NotificationFilterPutHRRequest(this.notificationConfigurations, this)); queueWrite(new NotificationFilterPutHRRequest(this.notificationConfigurations, this));
setVibrationStrength((short) 75); setVibrationStrength();
syncSettings(); syncSettings();
@ -122,6 +123,15 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter {
queueWrite(new SetDeviceStateRequest(GBDevice.State.INITIALIZED)); 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 @Override
public void setVibrationStrength(short strength) { public void setVibrationStrength(short strength) {
negotiateSymmetricKey(); negotiateSymmetricKey();
@ -667,8 +677,16 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter {
String[] menuItems = new String[jsonArray.length()]; String[] menuItems = new String[jsonArray.length()];
for (int i = 0; i < jsonArray.length(); i++) menuItems[i] = jsonArray.getString(i); for (int i = 0; i < jsonArray.length(); i++) menuItems[i] = jsonArray.getString(i);
SharedPreferences prefs = getDeviceSpecificPreferences();
String upperButtonApp = prefs.getString(DeviceSettingsPreferenceConst.PREF_BUTTON_1_FUNCTION, "weatherApp");
String middleButtonApp = prefs.getString(DeviceSettingsPreferenceConst.PREF_BUTTON_2_FUNCTION, "commuteApp");
String lowerButtonApp = prefs.getString(DeviceSettingsPreferenceConst.PREF_BUTTON_3_FUNCTION, "musicApp");
queueWrite(new ButtonConfigurationPutRequest( queueWrite(new ButtonConfigurationPutRequest(
menuItems, menuItems,
upperButtonApp,
middleButtonApp,
lowerButtonApp,
this this
)); ));
} catch (JSONException e) { } catch (JSONException e) {
@ -676,6 +694,19 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter {
} }
} }
@Override
public void onSendConfiguration(String config) {
switch (config) {
case DeviceSettingsPreferenceConst.PREF_BUTTON_1_FUNCTION:
case DeviceSettingsPreferenceConst.PREF_BUTTON_2_FUNCTION:
case DeviceSettingsPreferenceConst.PREF_BUTTON_3_FUNCTION:
overwriteButtons(null);
break;
case DeviceSettingsPreferenceConst.PREF_VIBRATION_STRENGH_PERCENTAGE:
setVibrationStrength();
}
}
@Override @Override
public void handleHeartRateCharacteristic(BluetoothGattCharacteristic characteristic) { public void handleHeartRateCharacteristic(BluetoothGattCharacteristic characteristic) {
super.handleHeartRateCharacteristic(characteristic); super.handleHeartRateCharacteristic(characteristic);

View File

@ -465,6 +465,11 @@ public class MisfitWatchAdapter extends WatchAdapter {
return; return;
} }
@Override
public void onSendConfiguration(String config) {
}
@Override @Override
public void overwriteButtons(String jsonConfigString) { public void overwriteButtons(String jsonConfigString) {
uploadFileRequest = new UploadFileRequest((short) 0x0800, new byte[]{ uploadFileRequest = new UploadFileRequest((short) 0x0800, new byte[]{

View File

@ -19,6 +19,7 @@ package nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fo
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.ByteOrder; import java.nio.ByteOrder;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.zip.CRC32; import java.util.zip.CRC32;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.adapter.fossil.FossilWatchAdapter; 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); byte[] senderBytes = nullTerminatedSender.getBytes(charsetUTF8);
String nullTerminatedMessage = StringUtils.terminateNull(message); String nullTerminatedMessage = StringUtils.terminateNull(message);
byte[] messageBytes = nullTerminatedMessage.getBytes(charsetUTF8); 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); short mainBufferLength = (short) (lengthBufferLength + uidLength + appBundleCRCLength + titleBytes.length + senderBytes.length + messageBytes.length);
ByteBuffer mainBuffer = ByteBuffer.allocate(mainBufferLength); ByteBuffer mainBuffer = ByteBuffer.allocate(mainBufferLength);

View File

@ -12,11 +12,11 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fos
import nodomain.freeyourgadget.gadgetbridge.util.GB; import nodomain.freeyourgadget.gadgetbridge.util.GB;
public class ButtonConfigurationPutRequest extends JsonPutRequest { public class ButtonConfigurationPutRequest extends JsonPutRequest {
public ButtonConfigurationPutRequest(String[] menuItems, FossilHRWatchAdapter adapter) { public ButtonConfigurationPutRequest(String[] menuItems, String upperButtonApp, String middleButtonApp, String lowerButtonApp, FossilHRWatchAdapter adapter) {
super(createObject(menuItems), adapter); super(createObject(menuItems, upperButtonApp, middleButtonApp, lowerButtonApp), adapter);
} }
private static JSONObject createObject(String[] menuItems) { private static JSONObject createObject(String[] menuItems, String upperButtonApp, String middleButtonApp, String lowerButtonApp) {
try { try {
return new JSONObject() return new JSONObject()
.put("push", new JSONObject() .put("push", new JSONObject()
@ -24,15 +24,15 @@ public class ButtonConfigurationPutRequest extends JsonPutRequest {
.put("commuteApp._.config.destinations", new JSONArray(menuItems)) .put("commuteApp._.config.destinations", new JSONArray(menuItems))
.put("master._.config.buttons", new JSONArray() .put("master._.config.buttons", new JSONArray()
.put(new JSONObject() .put(new JSONObject()
.put("name", "weatherApp") .put("name", upperButtonApp)
.put("button_evt", "top_short_press_release") .put("button_evt", "top_short_press_release")
) )
.put(new JSONObject() .put(new JSONObject()
.put("name", "commuteApp") .put("name", middleButtonApp)
.put("button_evt", "middle_short_press_release") .put("button_evt", "middle_short_press_release")
) )
.put(new JSONObject() .put(new JSONObject()
.put("name", "commuteApp") .put("name", lowerButtonApp)
.put("button_evt", "bottom_short_press_release") .put("button_evt", "bottom_short_press_release")
) )
) )

View File

@ -335,7 +335,7 @@
<string name="mi2_prefs_button_actions">Accions del botó</string> <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_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">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_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">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> <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">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_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">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_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_rotate_wrist_to_switch_info">Gira el canell per canviar la informació</string>
<string name="mi2_prefs_do_not_disturb">No molesteu</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_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_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="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="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_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> <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="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="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="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> </resources>

View File

@ -845,4 +845,14 @@
<string name="find_lost_device_you_found_it">Gefunden!</string> <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_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="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> </resources>

View File

@ -838,4 +838,15 @@
<string name="find_lost_device_you_found_it">מצאתי!</string> <string name="find_lost_device_you_found_it">מצאתי!</string>
<string name="pref_title_force_white_color_scheme">לאכוף ערכת צבעים שחור על לבן</string> <string name="pref_title_force_white_color_scheme">לאכוף ערכת צבעים שחור על לבן</string>
<string name="pref_summary_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> </resources>

View File

@ -836,4 +836,15 @@
<string name="find_lost_device_you_found_it">Gevonden!</string> <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_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="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> </resources>

View File

@ -848,4 +848,15 @@
<string name="find_lost_device_you_found_it">Encontrei!</string> <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_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="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> </resources>

View File

@ -823,4 +823,9 @@
<string name="devicetype_itag">iTag</string> <string name="devicetype_itag">iTag</string>
<string name="pref_title_allow_high_mtu">Разрешить высокий MTU</string> <string name="pref_title_allow_high_mtu">Разрешить высокий MTU</string>
<string name="pref_summary_allow_high_mtu">Увеличивает скорость передачи данных, но может не работать на некоторых Android-устройствах.</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> </resources>

View File

@ -838,4 +838,13 @@
<string name="pref_summary_force_white_color_scheme">如果您双手颜色较深,将会有帮助</string> <string name="pref_summary_force_white_color_scheme">如果您双手颜色较深,将会有帮助</string>
<string name="find_my_phone_notification">查找我的手机</string> <string name="find_my_phone_notification">查找我的手机</string>
<string name="notification_channel_high_priority_name">Gadgetbridge 通知高优先级</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> </resources>

View File

@ -401,4 +401,71 @@
<string name="fw_upgrade_notice">您即將安裝 %s。</string> <string name="fw_upgrade_notice">您即將安裝 %s。</string>
<string name="notif_battery_low_title">裝置電量不足!</string> <string name="notif_battery_low_title">裝置電量不足!</string>
<string name="notif_battery_low_percent">%1$s 電量剩餘:%2$s%%</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> </resources>

View File

@ -680,4 +680,25 @@
<string name="pref_media_forward_value" translatable="false">FORWARD</string> <string name="pref_media_forward_value" translatable="false">FORWARD</string>
<string name="pref_media_rewind_value" translatable="false">REWIND</string> <string name="pref_media_rewind_value" translatable="false">REWIND</string>
<string-array name="pref_hybridhr_buttonfunctions">
<item name="notificationsPanelApp">@string/menuitem_notifications</item>
<item name="weatherApp">@string/menuitem_weather</item>
<item name="musicApp">@string/menuitem_music</item>
<item name="stopwatchApp">@string/hr_appname_stopwatch</item>
<item name="timerApp">@string/menuitem_timer</item>
<item name="commuteApp">@string/hr_appname_commute</item>
<item name="wellnessApp">@string/hr_appname_wellness</item>
<item name="workoutApp">@string/hr_appname_workout</item>
</string-array>
<string-array name="pref_hybridhr_buttonfunctions_values">
<item>notificationsPanelApp</item>
<item>weatherApp</item>
<item>musicApp</item>
<item>stopwatchApp</item>
<item>timerApp</item>
<item>commuteApp"</item>
<item>wellnessApp</item>
<item>workoutApp</item>
</string-array>
</resources> </resources>

View File

@ -186,6 +186,7 @@
<string name="pref_summary_allow_high_mtu">Increases transfer speed, but might not work on some Android devices.</string> <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_summary_sync_calendar">Enables calendar alerts, even when disconnected</string>
<string name="pref_title_sync_caldendar">Sync calendar events</string> <string name="pref_title_sync_caldendar">Sync calendar events</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">Connect new device button</string>
<string name="pref_display_add_device_fab_on">Always visible</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> <string name="pref_display_add_device_fab_off">Visible only if no device is added</string>
@ -833,6 +834,15 @@
<string name="hr_widget_weather">Weather</string> <string name="hr_widget_weather">Weather</string>
<string name="hr_widget_nothing">Nothing</string> <string name="hr_widget_nothing">Nothing</string>
<string name="hr_appname_wellness">Wellness</string>
<string name="hr_appname_workout">Workout</string>
<string name="hr_appname_stopwatch">Stopwatch</string>
<string name="hr_appname_commute">Commute</string>
<string name="pref_title_upper_button_function">Upper Button</string>
<string name="pref_title_middle_button_function">Middle Button</string>
<string name="pref_title_lower_button_function">Lower Button</string>
<string name="prefs_button_single_press_action_selection_title">Event 1 action</string> <string name="prefs_button_single_press_action_selection_title">Event 1 action</string>
<string name="prefs_button_double_press_action_selection_title">Event 2 action</string> <string name="prefs_button_double_press_action_selection_title">Event 2 action</string>
<string name="prefs_button_triple_press_action_selection_title">Event 3 action</string> <string name="prefs_button_triple_press_action_selection_title">Event 3 action</string>

View File

@ -1,5 +1,13 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<changelog> <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"> <release version="0.42.1" versioncode="168">
<change>Fix accepting/rejecting calls on Android 9</change> <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> <change>Mi Band 3/4, Amazfit Bip/Cor/GTS/GTR: Option to sync calender events as reminder</change>

View File

@ -1,8 +1,37 @@
<?xml version="1.0" encoding="utf-8"?> <?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"
android:entryValues="@array/pref_hybridhr_buttonfunctions_values"
android:key="button_1_function"
android:summary="%s"
android:title="@string/pref_title_upper_button_function" />
<ListPreference
android:defaultValue="commuteApp"
android:entries="@array/pref_hybridhr_buttonfunctions"
android:entryValues="@array/pref_hybridhr_buttonfunctions_values"
android:key="button_2_function"
android:summary="%s"
android:title="@string/pref_title_middle_button_function" />
<ListPreference
android:defaultValue="musicApp"
android:entries="@array/pref_hybridhr_buttonfunctions"
android:entryValues="@array/pref_hybridhr_buttonfunctions_values"
android:key="button_3_function"
android:summary="%s"
android:title="@string/pref_title_lower_button_function" />
<SwitchPreference <SwitchPreference
android:defaultValue="false" android:defaultValue="false"
android:key="force_white_color_scheme" android:key="force_white_color_scheme"
android:summary="@string/pref_summary_force_white_color_scheme" android:summary="@string/pref_summary_force_white_color_scheme"
android:title="@string/pref_title_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> </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