1
0
mirror of https://codeberg.org/Freeyourgadget/Gadgetbridge synced 2024-07-09 23:21:34 +02:00

Merge branch 'master' of github.com:Freeyourgadget/Gadgetbridge into fossil-q-hybrid

This commit is contained in:
dakhnod 2019-12-04 00:48:26 +01:00
commit f4a0f0ce8f
129 changed files with 696 additions and 235 deletions

View File

@ -1,5 +1,9 @@
### Changelog ### Changelog
#### Version 0.39.1
* Try to actively re-connect when a connection gets interrupted (interval grows up to 64 seconds)
* Mi Band2/Amazfip Bip: Make button action settings per-device and enable for Amazfit Bip
#### Version 0.39.0 #### Version 0.39.0
* Amazfit GTS: Initial and incomplete support, mostly untested * Amazfit GTS: Initial and incomplete support, mostly untested
* Add forward/backward buttons to charts for faster navigation * Add forward/backward buttons to charts for faster navigation

View File

@ -30,9 +30,11 @@ vendor's servers.
## Supported Devices (Some of them WIP and some of them without maintainer) ## 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 [Wiki](https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/Amazfit-Bip)
* Amazfit Bip Lite (NOT RECOMMENDED, NEEDS MI FIT WITH ACCOUNT AND ROOT ONCE) [Wiki](https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/Amazfit-Bip-Lite) * Amazfit Bip Lite (NOT RECOMMENDED, 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 [Wiki](https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/Amazfit-Cor)
* Amazfit Cor 2 [Wiki](https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/Amazfit-Cor-2) * 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)
* BFH-16 * BFH-16
* Casio GB-6900B * Casio GB-6900B
* HPlus Devices (e.g. ZeBand) [Wiki](https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/HPlus) * HPlus Devices (e.g. ZeBand) [Wiki](https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/HPlus)

View File

@ -25,8 +25,8 @@ android {
targetSdkVersion 27 targetSdkVersion 27
// Note: always bump BOTH versionCode and versionName! // Note: always bump BOTH versionCode and versionName!
versionName "0.39.0" versionName "0.39.1"
versionCode 161 versionCode 162
vectorDrawables.useSupportLibrary = true vectorDrawables.useSupportLibrary = true
} }
buildTypes { buildTypes {

View File

@ -46,6 +46,9 @@ import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
@ -103,7 +106,7 @@ public class GBApplication extends Application {
private static SharedPreferences sharedPrefs; private static SharedPreferences sharedPrefs;
private static final String PREFS_VERSION = "shared_preferences_version"; private static final String PREFS_VERSION = "shared_preferences_version";
//if preferences have to be migrated, increment the following and add the migration logic in migratePrefs below; see http://stackoverflow.com/questions/16397848/how-can-i-migrate-android-preferences-with-a-new-version //if preferences have to be migrated, increment the following and add the migration logic in migratePrefs below; see http://stackoverflow.com/questions/16397848/how-can-i-migrate-android-preferences-with-a-new-version
private static final int CURRENT_PREFS_VERSION = 5; private static final int CURRENT_PREFS_VERSION = 6;
private static LimitedQueue mIDSenderLookup = new LimitedQueue(16); private static LimitedQueue mIDSenderLookup = new LimitedQueue(16);
private static Prefs prefs; private static Prefs prefs;
private static GBPrefs gbPrefs; private static GBPrefs gbPrefs;
@ -596,6 +599,58 @@ public class GBApplication extends Application {
} }
} }
private void migrateStringPrefToPerDevicePref(String globalPref, String globalPrefDefault, String perDevicePref, ArrayList<DeviceType> deviceTypes) {
SharedPreferences.Editor editor = sharedPrefs.edit();
String globalPrefValue = prefs.getString(globalPref, globalPrefDefault);
try (DBHandler db = acquireDB()) {
DaoSession daoSession = db.getDaoSession();
List<Device> activeDevices = DBHelper.getActiveDevices(daoSession);
for (Device dbDevice : activeDevices) {
SharedPreferences deviceSpecificSharedPrefs = GBApplication.getDeviceSpecificSharedPrefs(dbDevice.getIdentifier());
if (deviceSpecificSharedPrefs != null) {
SharedPreferences.Editor deviceSharedPrefsEdit = deviceSpecificSharedPrefs.edit();
DeviceType deviceType = fromKey(dbDevice.getType());
if (deviceTypes.contains(deviceType)) {
Log.i(TAG, "migrating global string preference " + globalPref + " for " + deviceType.name() + " " + dbDevice.getIdentifier() );
deviceSharedPrefsEdit.putString(perDevicePref, globalPrefValue);
}
deviceSharedPrefsEdit.apply();
}
}
editor.remove(globalPref);
editor.apply();
} catch (Exception e) {
Log.w(TAG, "error acquiring DB lock");
}
}
private void migrateBooleanPrefToPerDevicePref(String globalPref, Boolean globalPrefDefault, String perDevicePref, ArrayList<DeviceType> deviceTypes) {
SharedPreferences.Editor editor = sharedPrefs.edit();
boolean globalPrefValue = prefs.getBoolean(globalPref, globalPrefDefault);
try (DBHandler db = acquireDB()) {
DaoSession daoSession = db.getDaoSession();
List<Device> activeDevices = DBHelper.getActiveDevices(daoSession);
for (Device dbDevice : activeDevices) {
SharedPreferences deviceSpecificSharedPrefs = GBApplication.getDeviceSpecificSharedPrefs(dbDevice.getIdentifier());
if (deviceSpecificSharedPrefs != null) {
SharedPreferences.Editor deviceSharedPrefsEdit = deviceSpecificSharedPrefs.edit();
DeviceType deviceType = fromKey(dbDevice.getType());
if (deviceTypes.contains(deviceType)) {
Log.i(TAG, "migrating global boolean preference " + globalPref + " for " + deviceType.name() + " " + dbDevice.getIdentifier() );
deviceSharedPrefsEdit.putBoolean(perDevicePref, globalPrefValue);
}
deviceSharedPrefsEdit.apply();
}
}
editor.remove(globalPref);
editor.apply();
} catch (Exception e) {
Log.w(TAG, "error acquiring DB lock");
}
}
private void migratePrefs(int oldVersion) { private void migratePrefs(int oldVersion) {
SharedPreferences.Editor editor = sharedPrefs.edit(); SharedPreferences.Editor editor = sharedPrefs.edit();
if (oldVersion == 0) { if (oldVersion == 0) {
@ -684,7 +739,7 @@ public class GBApplication extends Application {
switch (deviceType) { switch (deviceType) {
case MIBAND: case MIBAND:
deviceSharedPrefsEdit.putBoolean("low_latency_fw_update", prefs.getBoolean("mi_low_latency_fw_update", true)); deviceSharedPrefsEdit.putBoolean("low_latency_fw_update", prefs.getBoolean("mi_low_latency_fw_update", true));
deviceSharedPrefsEdit.putInt("device_time_offset_hours", prefs.getInt("mi_device_time_offset_hours", 0)); deviceSharedPrefsEdit.putString("device_time_offset_hours", String.valueOf(prefs.getInt("mi_device_time_offset_hours", 0)));
break; break;
case AMAZFITCOR: case AMAZFITCOR:
displayItems = prefs.getStringSet("cor_display_items", null); displayItems = prefs.getStringSet("cor_display_items", null);
@ -825,6 +880,14 @@ public class GBApplication extends Application {
Log.w(TAG, "error acquiring DB lock"); Log.w(TAG, "error acquiring DB lock");
} }
} }
if (oldVersion < 6) {
migrateBooleanPrefToPerDevicePref("mi2_enable_button_action", false, "button_action_enable", new ArrayList<>(Collections.singletonList(MIBAND2)));
migrateBooleanPrefToPerDevicePref("mi2_button_action_vibrate", false, "button_action_vibrate", new ArrayList<>(Collections.singletonList(MIBAND2)));
migrateStringPrefToPerDevicePref("mi_button_press_count", "6", "button_action_press_count", new ArrayList<>(Collections.singletonList(MIBAND2)));
migrateStringPrefToPerDevicePref("mi_button_press_count_max_delay", "2000", "button_action_press_max_interval", new ArrayList<>(Collections.singletonList(MIBAND2)));
migrateStringPrefToPerDevicePref("mi_button_press_count_match_delay", "0", "button_action_broadcast_delay", new ArrayList<>(Collections.singletonList(MIBAND2)));
migrateStringPrefToPerDevicePref("mi_button_press_broadcast", "nodomain.freeyourgadget.gadgetbridge.ButtonPressed", "button_action_broadcast", new ArrayList<>(Collections.singletonList(MIBAND2)));
}
editor.putString(PREFS_VERSION, Integer.toString(CURRENT_PREFS_VERSION)); editor.putString(PREFS_VERSION, Integer.toString(CURRENT_PREFS_VERSION));
editor.apply(); editor.apply();

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2016-2019 0nse, Andreas Shimokawa, Carsten Pfeiffer /* Copyright (C) 2019 Andreas Shimokawa, vanous
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,5 +1,5 @@
/* Copyright (C) 2016-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele /* Copyright (C) 2016-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele
Gobbetti, Johannes Tysiak, Taavi Eomäe Gobbetti, Johannes Tysiak, Taavi Eomäe, vanous
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,5 +1,5 @@
/* Copyright (C) 2016-2019 Alberto, Andreas Shimokawa, Carsten Pfeiffer, /* Copyright (C) 2016-2019 Alberto, Andreas Shimokawa, Carsten Pfeiffer,
Daniele Gobbetti Daniele Gobbetti, vanous
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,6 +1,6 @@
/* Copyright (C) 2015-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele /* Copyright (C) 2015-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele
Gobbetti, Frank Slezak, ivanovlev, Kasha, Lem Dulfo, Pavel Elagin, Steffen Gobbetti, Frank Slezak, ivanovlev, Kasha, Lem Dulfo, Pavel Elagin, Steffen
Liebergeld Liebergeld, vanous
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,5 +1,5 @@
/* Copyright (C) 2018-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele /* Copyright (C) 2018-2019 Andreas Shimokawa, Carsten Pfeiffer, Cre3per,
Gobbetti Daniele Gobbetti
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,6 +1,6 @@
/* Copyright (C) 2015-2019 0nse, Andreas Shimokawa, Carsten Pfeiffer, /* Copyright (C) 2015-2019 0nse, Andreas Shimokawa, Carsten Pfeiffer,
Daniele Gobbetti, Felix Konstantin Maurer, José Rebelo, Martin, Normano64, Daniele Gobbetti, Felix Konstantin Maurer, José Rebelo, Martin, Normano64,
Pavel Elagin, Sebastian Kranz Pavel Elagin, Sebastian Kranz, vanous
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,3 +1,19 @@
/* Copyright (C) 2019 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.activities; package nodomain.freeyourgadget.gadgetbridge.activities;
import android.app.Activity; import android.app.Activity;

View File

@ -1,5 +1,5 @@
/* Copyright (C) 2015-2019 0nse, Andreas Shimokawa, Carsten Pfeiffer, /* Copyright (C) 2015-2019 0nse, Andreas Shimokawa, Carsten Pfeiffer,
Daniele Gobbetti, Dikay900, Pavel Elagin, walkjivefly Daniele Gobbetti, Dikay900, Pavel Elagin, vanous, walkjivefly
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,5 +1,5 @@
/* Copyright (C) 2015-2019 0nse, Alberto, Andreas Shimokawa, Carsten Pfeiffer, /* Copyright (C) 2015-2019 0nse, Alberto, Andreas Shimokawa, Carsten Pfeiffer,
Daniele Gobbetti, Pavel Elagin Daniele Gobbetti, Pavel Elagin, vanous
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,5 +1,5 @@
/* Copyright (C) 2015-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele /* Copyright (C) 2015-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele
Gobbetti, Pavel Elagin, Vebryn Gobbetti, Pavel Elagin, vanous, Vebryn
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,3 +1,19 @@
/* Copyright (C) 2019 Andreas Shimokawa, 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.activities.charts; package nodomain.freeyourgadget.gadgetbridge.activities.charts;
import android.graphics.Canvas; import android.graphics.Canvas;

View File

@ -1,5 +1,5 @@
/* Copyright (C) 2015-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele /* Copyright (C) 2015-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele
Gobbetti, Vebryn Gobbetti, vanous, Vebryn
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2015-2019 Andreas Shimokawa, Carsten Pfeiffer /* Copyright (C) 2015-2019 Andreas Shimokawa, Carsten Pfeiffer, vanous
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,5 +1,5 @@
/* Copyright (C) 2015-2019 Andreas Shimokawa, Carsten Pfeiffer, Christian /* Copyright (C) 2015-2019 Andreas Shimokawa, Carsten Pfeiffer, Lem Dulfo,
Fischer, Daniele Gobbetti, José Rebelo, Szymon Tomasz Stefanek vanous
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,5 +1,5 @@
/* Copyright (C) 2015-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele /* Copyright (C) 2015-2019 Andreas Shimokawa, Carsten Pfeiffer, Cre3per,
Gobbetti, Dikay900, Pavel, Pavel Elagin Daniele Gobbetti, Dikay900, Pavel, Pavel Elagin
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,3 +1,19 @@
/* Copyright (C) 2019 Q-er
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.activities.charts; package nodomain.freeyourgadget.gadgetbridge.activities.charts;
import java.util.ArrayList; import java.util.ArrayList;

View File

@ -1,5 +1,5 @@
/* Copyright (C) 2015-2019 0nse, Andreas Shimokawa, Carsten Pfeiffer, /* Copyright (C) 2015-2019 0nse, Andreas Shimokawa, Carsten Pfeiffer,
Daniele Gobbetti, Dikay900, Pavel Elagin Daniele Gobbetti, Dikay900, Pavel Elagin, Q-er, vanous
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2016-2019 Carsten Pfeiffer /* Copyright (C) 2016-2019 Andreas Shimokawa, Carsten Pfeiffer
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,4 +1,5 @@
/* Copyright (C) 2017-2019 Andreas Shimokawa, Carsten Pfeiffer, Pavel Elagin /* Copyright (C) 2017-2019 Andreas Shimokawa, Carsten Pfeiffer, Pavel
Elagin, vanous
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,5 +1,5 @@
/* Copyright (C) 2015-2019 0nse, Andreas Shimokawa, Carsten Pfeiffer, /* Copyright (C) 2015-2019 0nse, Andreas Shimokawa, Carsten Pfeiffer,
Daniele Gobbetti, Pavel Elagin Daniele Gobbetti, Pavel Elagin, vanous
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,5 +1,4 @@
/* Copyright (C) 2018-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele /* Copyright (C) 2019 Andreas Shimokawa
Gobbetti
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,3 +1,19 @@
/* Copyright (C) 2019 Andreas Shimokawa
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.activities.devicesettings; package nodomain.freeyourgadget.gadgetbridge.activities.devicesettings;
public class DeviceSettingsPreferenceConst { public class DeviceSettingsPreferenceConst {

View File

@ -1,3 +1,19 @@
/* Copyright (C) 2019 Andreas Shimokawa, Cre3per
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.activities.devicesettings; package nodomain.freeyourgadget.gadgetbridge.activities.devicesettings;
import android.os.Bundle; import android.os.Bundle;

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2015-2019 Andreas Shimokawa /* Copyright (C) 2015-2019 Andreas Böhler, Andreas Shimokawa
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,5 +1,5 @@
/* Copyright (C) 2015-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele /* Copyright (C) 2015-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele
Gobbetti, José Rebelo, Matthieu Baerts Gobbetti, José Rebelo, Matthieu Baerts, Nephiel, vanous
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,5 +1,5 @@
/* Copyright (C) 2015-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele /* Copyright (C) 2015-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele
Gobbetti, JohnnySun, José Rebelo, Matthieu Baerts, Uwe Hermann Gobbetti, JohnnySun, José Rebelo, Matthieu Baerts, Nephiel, Uwe Hermann
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2017-2019 Andreas Shimokawa, Carsten Pfeiffer /* Copyright (C) 2017-2019 Andreas Shimokawa, Carsten Pfeiffer, Nephiel
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,5 +1,5 @@
/* Copyright (C) 2016-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele /* Copyright (C) 2016-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele
Gobbetti, José Rebelo Gobbetti, José Rebelo, Nephiel
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,5 +1,5 @@
/* Copyright (C) 2017-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele /* Copyright (C) 2017-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele
Gobbetti, João Paulo Barraca Gobbetti, João Paulo Barraca, Nephiel
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,5 +1,5 @@
/* Copyright (C) 2017-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele /* Copyright (C) 2017-2019 Andreas Shimokawa, Daniele Gobbetti, João
Gobbetti, João Paulo Barraca Paulo Barraca, José Rebelo, tiparega
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,5 +1,5 @@
/* Copyright (C) 2017-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele /* Copyright (C) 2017-2019 Andreas Shimokawa, Daniele Gobbetti, João
Gobbetti, João Paulo Barraca Paulo Barraca, José Rebelo, tiparega
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,3 +1,19 @@
/* Copyright (C) 2019 Andreas Shimokawa, Manuel Ruß
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.amazfitgts; package nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitgts;
import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothDevice;

View File

@ -1,4 +1,5 @@
/* Copyright (C) 2016-2019 Andreas Shimokawa /* Copyright (C) 2016-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele
Gobbetti, HardLight, José Rebelo
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2018-2019 Vadim Kaushan /* Copyright (C) 2018-2019 Andreas Shimokawa, Vadim Kaushan
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2019 Sophanimus /* Copyright (C) 2019 Andreas Shimokawa, Sophanimus
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,5 +1,4 @@
/* Copyright (C) 2016-2019 Andreas Shimokawa, Carsten Pfeiffer, João /* Copyright (C) 2019 Andreas Shimokawa, Cre3per
Paulo Barraca
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,4 +1,5 @@
/* Copyright (C) 2017-2019 Daniele Gobbetti, João Paulo Barraca, tiparega /* Copyright (C) 2016-2019 Andreas Shimokawa, Carsten Pfeiffer, Cre3per,
Daniele Gobbetti, José Rebelo, Petr Kadlec, protomors
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2018-2019 Daniele Gobbetti, Sebastian Kranz /* Copyright (C) 2018-2019 Cre3per, Daniele Gobbetti, Sebastian Kranz
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,4 +1,5 @@
/* Copyright (C) 2019 Andreas Shimokawa /* Copyright (C) 2016-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele
Gobbetti, José Rebelo
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2018-2019 Kranz, Sebastian Kranz /* Copyright (C) 2018-2019 Andreas Shimokawa, Kranz, Sebastian Kranz
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2018-2019 Sebastian Kranz /* Copyright (C) 2018-2019 Andreas Shimokawa, Sebastian Kranz
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2017-2019 Andreas Shimokawa /* Copyright (C) 2017-2019 Andreas Shimokawa, keeshii
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,5 +1,5 @@
/* Copyright (C) 2015-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele /* Copyright (C) 2015-2019 Andreas Böhler, Andreas Shimokawa, Carsten
Gobbetti, Johannes Tysiak, Normano64 Pfeiffer, Daniele Gobbetti, Johannes Tysiak, Normano64
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,5 +1,5 @@
/* Copyright (C) 2015-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele /* Copyright (C) 2015-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniel
Gobbetti, José Rebelo, Taavi Eomäe, Uwe Hermann Dakhno, Daniele Gobbetti, José Rebelo, Taavi Eomäe, Uwe Hermann
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,6 +1,7 @@
/* Copyright (C) 2015-2019 Alberto, Andreas Shimokawa, Carsten Pfeiffer, /* Copyright (C) 2015-2019 Alberto, Andreas Böhler, Andreas Shimokawa,
criogenic, dakhnod, Daniele Gobbetti, Frank Slezak, ivanovlev, José Rebelo, Carsten Pfeiffer, criogenic, dakhnod, Daniele Gobbetti, Frank Slezak,
Julien Pivotto, Kasha, Roi Greenberg, Sebastian Kranz, Steffen Liebergeld ivanovlev, José Rebelo, Julien Pivotto, Kasha, Roi Greenberg, Sebastian
Kranz, Steffen Liebergeld
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,6 +1,6 @@
/* Copyright (C) 2016-2019 Andreas Shimokawa, AnthonyDiGirolamo, Daniele /* Copyright (C) 2016-2019 Andreas Shimokawa, AnthonyDiGirolamo, Daniele
Gobbetti, Frank Slezak, Kaz Wolfe, Kevin Richter, Lukas Veneziano, Matthieu Gobbetti, Frank Slezak, Kaz Wolfe, Kevin Richter, Lukas Veneziano, Marvin D,
Baerts, michaelneu, NotAFIle, Tomas Radej Matthieu Baerts, michaelneu, NotAFIle, Tomas Radej
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2017-2019 Carsten Pfeiffer, Daniele Gobbetti /* Copyright (C) 2019 Andreas Shimokawa, vanous
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,7 +1,7 @@
/* Copyright (C) 2015-2019 Andreas Böhler, Andreas Shimokawa, Carsten /* Copyright (C) 2015-2019 Andreas Böhler, Andreas Shimokawa, Carsten
Pfeiffer, Daniele Gobbetti, Jean-François Greffier, João Paulo Barraca, Pfeiffer, Cre3per, Daniele Gobbetti, Jean-François Greffier, João Paulo
José Rebelo, Kranz, ladbsoft, maxirnilian, protomors, Quallenauge, Sami Barraca, José Rebelo, Kranz, ladbsoft, Manuel Ruß, maxirnilian, protomors,
Alaoui, Sebastian Kranz, Sophanimus, tiparega, Vadim Kaushan Quallenauge, Sami Alaoui, Sebastian Kranz, Sophanimus, tiparega, Vadim Kaushan
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,5 +1,5 @@
/* Copyright (C) 2015-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele /* Copyright (C) 2015-2019 Andreas Böhler, Andreas Shimokawa, Carsten
Gobbetti, José Rebelo, Sebastian Kranz, Taavi Eomäe Pfeiffer, Daniele Gobbetti, José Rebelo, Sebastian Kranz, Taavi Eomäe
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,8 +1,8 @@
/* Copyright (C) 2015-2019 Andreas Shimokawa, Avamander, Carsten Pfeiffer, /* Copyright (C) 2015-2019 Andreas Böhler, Andreas Shimokawa, Avamander,
dakhnod, Daniele Gobbetti, Daniel Hauck, Dikay900, Frank Slezak, ivanovlev, Carsten Pfeiffer, dakhnod, Daniele Gobbetti, Daniel Hauck, Dikay900, Frank
João Paulo Barraca, José Rebelo, Julien Pivotto, Kasha, Martin, Matthieu Slezak, ivanovlev, João Paulo Barraca, José Rebelo, Julien Pivotto, Kasha,
Baerts, Sebastian Kranz, Sergey Trofimov, Steffen Liebergeld, Taavi Eomäe, keeshii, Martin, Matthieu Baerts, Nephiel, Sebastian Kranz, Sergey Trofimov,
Uwe Hermann Steffen Liebergeld, Taavi Eomäe, Uwe Hermann
This file is part of Gadgetbridge. This file is part of Gadgetbridge.
@ -44,14 +44,12 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Random;
import java.util.UUID; import java.util.UUID;
import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.activities.HeartRateUtils; import nodomain.freeyourgadget.gadgetbridge.activities.HeartRateUtils;
import nodomain.freeyourgadget.gadgetbridge.devices.DeviceCoordinator; import nodomain.freeyourgadget.gadgetbridge.devices.DeviceCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiCoordinator;
import nodomain.freeyourgadget.gadgetbridge.externalevents.AlarmClockReceiver; import nodomain.freeyourgadget.gadgetbridge.externalevents.AlarmClockReceiver;
import nodomain.freeyourgadget.gadgetbridge.externalevents.AlarmReceiver; import nodomain.freeyourgadget.gadgetbridge.externalevents.AlarmReceiver;
import nodomain.freeyourgadget.gadgetbridge.externalevents.BluetoothConnectReceiver; import nodomain.freeyourgadget.gadgetbridge.externalevents.BluetoothConnectReceiver;
@ -75,13 +73,13 @@ import nodomain.freeyourgadget.gadgetbridge.model.MusicStateSpec;
import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec; import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
import nodomain.freeyourgadget.gadgetbridge.model.NotificationType; import nodomain.freeyourgadget.gadgetbridge.model.NotificationType;
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec; import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
import nodomain.freeyourgadget.gadgetbridge.service.receivers.AutoConnectIntervalReceiver;
import nodomain.freeyourgadget.gadgetbridge.service.receivers.GBAutoFetchReceiver; import nodomain.freeyourgadget.gadgetbridge.service.receivers.GBAutoFetchReceiver;
import nodomain.freeyourgadget.gadgetbridge.util.DeviceHelper; import nodomain.freeyourgadget.gadgetbridge.util.DeviceHelper;
import nodomain.freeyourgadget.gadgetbridge.util.EmojiConverter; import nodomain.freeyourgadget.gadgetbridge.util.EmojiConverter;
import nodomain.freeyourgadget.gadgetbridge.util.GB; import nodomain.freeyourgadget.gadgetbridge.util.GB;
import nodomain.freeyourgadget.gadgetbridge.util.GBPrefs; import nodomain.freeyourgadget.gadgetbridge.util.GBPrefs;
import nodomain.freeyourgadget.gadgetbridge.util.Prefs; import nodomain.freeyourgadget.gadgetbridge.util.Prefs;
import nodomain.freeyourgadget.gadgetbridge.util.StringUtils;
import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_ADD_CALENDAREVENT; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_ADD_CALENDAREVENT;
import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_APP_CONFIGURE; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_APP_CONFIGURE;
@ -193,6 +191,7 @@ public class DeviceCommunicationService extends Service implements SharedPrefere
private BluetoothPairingRequestReceiver mBlueToothPairingRequestReceiver = null; private BluetoothPairingRequestReceiver mBlueToothPairingRequestReceiver = null;
private AlarmClockReceiver mAlarmClockReceiver = null; private AlarmClockReceiver mAlarmClockReceiver = null;
private GBAutoFetchReceiver mGBAutoFetchReceiver = null; private GBAutoFetchReceiver mGBAutoFetchReceiver = null;
private AutoConnectIntervalReceiver mAutoConnectInvervalReceiver= null;
private AlarmReceiver mAlarmReceiver = null; private AlarmReceiver mAlarmReceiver = null;
private CalendarReceiver mCalendarReceiver = null; private CalendarReceiver mCalendarReceiver = null;
@ -760,6 +759,10 @@ public class DeviceCommunicationService extends Service implements SharedPrefere
mGBAutoFetchReceiver = new GBAutoFetchReceiver(); mGBAutoFetchReceiver = new GBAutoFetchReceiver();
registerReceiver(mGBAutoFetchReceiver, new IntentFilter("android.intent.action.USER_PRESENT")); registerReceiver(mGBAutoFetchReceiver, new IntentFilter("android.intent.action.USER_PRESENT"));
} }
if (mAutoConnectInvervalReceiver == null) {
mAutoConnectInvervalReceiver= new AutoConnectIntervalReceiver(this);
registerReceiver(mAutoConnectInvervalReceiver, new IntentFilter("GB_RECONNECT"));
}
} else { } else {
if (mPhoneCallReceiver != null) { if (mPhoneCallReceiver != null) {
unregisterReceiver(mPhoneCallReceiver); unregisterReceiver(mPhoneCallReceiver);
@ -809,6 +812,10 @@ public class DeviceCommunicationService extends Service implements SharedPrefere
unregisterReceiver(mGBAutoFetchReceiver); unregisterReceiver(mGBAutoFetchReceiver);
mGBAutoFetchReceiver = null; mGBAutoFetchReceiver = null;
} }
if (mAutoConnectInvervalReceiver != null) {
unregisterReceiver(mAutoConnectInvervalReceiver);
mAutoConnectInvervalReceiver = null;
}
} }
} }

View File

@ -1,7 +1,8 @@
/* Copyright (C) 2015-2019 0nse, Andreas Böhler, Andreas Shimokawa, Carsten /* Copyright (C) 2015-2019 0nse, Andreas Böhler, Andreas Shimokawa, Carsten
Pfeiffer, criogenic, Daniele Gobbetti, Jean-François Greffier, João Paulo Pfeiffer, Cre3per, criogenic, Daniele Gobbetti, Jean-François Greffier,
Barraca, José Rebelo, Kranz, ladbsoft, maxirnilian, protomors, Quallenauge, João Paulo Barraca, José Rebelo, Kranz, ladbsoft, Manuel Ruß, maxirnilian,
Sami Alaoui, Sergey Trofimov, Sophanimus, tiparega, Vadim Kaushan protomors, Quallenauge, Sami Alaoui, Sergey Trofimov, Sophanimus, tiparega,
Vadim Kaushan
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,5 +1,5 @@
/* Copyright (C) 2015-2019 Andreas Böhler, Andreas Shimokawa, Carsten /* Copyright (C) 2015-2019 Andreas Böhler, Andreas Shimokawa, Carsten
Pfeiffer, Daniele Gobbetti, Sergey Trofimov, Uwe Hermann Pfeiffer, Cre3per, Daniele Gobbetti, Sergey Trofimov, Uwe Hermann
This file is part of Gadgetbridge. This file is part of Gadgetbridge.
@ -49,6 +49,7 @@ import nodomain.freeyourgadget.gadgetbridge.Logging;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice.State; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice.State;
import nodomain.freeyourgadget.gadgetbridge.service.DeviceSupport; import nodomain.freeyourgadget.gadgetbridge.service.DeviceSupport;
import nodomain.freeyourgadget.gadgetbridge.service.receivers.AutoConnectIntervalReceiver;
/** /**
* One queue/thread per connectable device. * One queue/thread per connectable device.
@ -301,8 +302,6 @@ public final class BtLEQueue {
mWaitForServerActionResultLatch.countDown(); mWaitForServerActionResultLatch.countDown();
} }
boolean wasInitialized = mGbDevice.isInitialized();
setDeviceConnectionState(State.NOT_CONNECTED); setDeviceConnectionState(State.NOT_CONNECTED);
// either we've been disconnected because the device is out of range // either we've been disconnected because the device is out of range
@ -312,7 +311,7 @@ public final class BtLEQueue {
// reconnecting automatically, so we try to fix this by re-creating mBluetoothGatt. // reconnecting automatically, so we try to fix this by re-creating mBluetoothGatt.
// Not sure if this actually works without re-initializing the device... // Not sure if this actually works without re-initializing the device...
if (mBluetoothGatt != null) { if (mBluetoothGatt != null) {
if (!wasInitialized || !maybeReconnect()) { if (!maybeReconnect()) {
disconnect(); // ensure that we start over cleanly next time disconnect(); // ensure that we start over cleanly next time
} }
} }

View File

@ -19,6 +19,8 @@ package nodomain.freeyourgadget.gadgetbridge.service.btle.actions;
import android.bluetooth.BluetoothGatt; import android.bluetooth.BluetoothGatt;
import android.content.Context; import android.content.Context;
import androidx.annotation.NonNull;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
public class SetDeviceStateAction extends PlainAction { public class SetDeviceStateAction extends PlainAction {
@ -43,6 +45,7 @@ public class SetDeviceStateAction extends PlainAction {
return context; return context;
} }
@NonNull
@Override @Override
public String toString() { public String toString() {
return super.toString() + " to " + deviceState; return super.toString() + " to " + deviceState;

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2016-2018 Andreas Böhler /* Copyright (C) 2019 Andreas Böhler
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -141,6 +141,7 @@ import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.VI
import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.VIBRATION_PROFILE; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.VIBRATION_PROFILE;
import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.getNotificationPrefIntValue; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.getNotificationPrefIntValue;
import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.getNotificationPrefStringValue; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.getNotificationPrefStringValue;
import static nodomain.freeyourgadget.gadgetbridge.service.btle.GattCharacteristic.UUID_CHARACTERISTIC_ALERT_LEVEL;
public class HuamiSupport extends AbstractBTLEDeviceSupport { public class HuamiSupport extends AbstractBTLEDeviceSupport {
@ -706,7 +707,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
protected void onAlarmClock(NotificationSpec notificationSpec) { protected void onAlarmClock(NotificationSpec notificationSpec) {
alarmClockRinging = true; alarmClockRinging = true;
AbortTransactionAction abortAction = new StopNotificationAction(getCharacteristic(GattCharacteristic.UUID_CHARACTERISTIC_ALERT_LEVEL)) { AbortTransactionAction abortAction = new StopNotificationAction(getCharacteristic(UUID_CHARACTERISTIC_ALERT_LEVEL)) {
@Override @Override
protected boolean shouldAbort() { protected boolean shouldAbort() {
return !isAlarmClockRinging(); return !isAlarmClockRinging();
@ -739,7 +740,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
public void onSetCallState(CallSpec callSpec) { public void onSetCallState(CallSpec callSpec) {
if (callSpec.command == CallSpec.CALL_INCOMING) { if (callSpec.command == CallSpec.CALL_INCOMING) {
telephoneRinging = true; telephoneRinging = true;
AbortTransactionAction abortAction = new StopNotificationAction(getCharacteristic(GattCharacteristic.UUID_CHARACTERISTIC_ALERT_LEVEL)) { AbortTransactionAction abortAction = new StopNotificationAction(getCharacteristic(UUID_CHARACTERISTIC_ALERT_LEVEL)) {
@Override @Override
protected boolean shouldAbort() { protected boolean shouldAbort() {
return !isTelephoneRinging(); return !isTelephoneRinging();
@ -1083,8 +1084,20 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
// not supported // not supported
} }
public void runButtonAction() { // this could go though onion code with preferrednotification, but I this should work on all huami devices
Prefs prefs = GBApplication.getPrefs(); private void vibrateOnce() {
BluetoothGattCharacteristic characteristic = getCharacteristic(UUID_CHARACTERISTIC_ALERT_LEVEL);
try {
TransactionBuilder builder = performInitialized("Vibrate once");
builder.write(characteristic,new byte[] {3});
builder.queue(getQueue());
} catch (IOException e) {
LOG.error("error while sending simple vibrate command", e);
}
}
private void runButtonAction() {
Prefs prefs = new Prefs(GBApplication.getDeviceSpecificSharedPrefs(gbDevice.getAddress()));
if (currentButtonTimerActivationTime != currentButtonPressTime) { if (currentButtonTimerActivationTime != currentButtonPressTime) {
return; return;
@ -1099,7 +1112,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
LOG.info("Sending " + requiredButtonPressMessage + " with button_id " + currentButtonActionId); LOG.info("Sending " + requiredButtonPressMessage + " with button_id " + currentButtonActionId);
this.getContext().getApplicationContext().sendBroadcast(in); this.getContext().getApplicationContext().sendBroadcast(in);
if (prefs.getBoolean(HuamiConst.PREF_BUTTON_ACTION_VIBRATE, false)) { if (prefs.getBoolean(HuamiConst.PREF_BUTTON_ACTION_VIBRATE, false)) {
performPreferredNotification(null, null, null, HuamiService.ALERT_LEVEL_VIBRATE_ONLY, null); vibrateOnce();
} }
currentButtonActionId = 0; currentButtonActionId = 0;

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2017-2019 Andreas Shimokawa, Carsten Pfeiffer /* Copyright (C) 2017-2019 Andreas Shimokawa, Carsten Pfeiffer, MyTimeKill
This file is part of Gadgetbridge. This file is part of Gadgetbridge.
@ -158,10 +158,10 @@ public class AmazfitBipFirmwareInfo extends HuamiFirmwareInfo {
crcToVersion.put(59577, "9 (Latin)"); crcToVersion.put(59577, "9 (Latin)");
// BipOS FW // BipOS FW
crcToVersion.put(28373, "1.1.5.02 (BipOS 0.5)"); crcToVersion.put(28373, "1.1.2.05 (BipOS 0.5)");
// BipOS RES // BipOS RES
crcToVersion.put(16303, "1.1.5.02 (BipOS 0.5)"); crcToVersion.put(16303, "1.1.2.05 (BipOS 0.5)");
} }
public AmazfitBipFirmwareInfo(byte[] bytes) { public AmazfitBipFirmwareInfo(byte[] bytes) {

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2017-2019 Andreas Shimokawa, Carsten Pfeiffer /* Copyright (C) 2017-2019 Andreas Shimokawa, Daniele Gobbetti
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,5 +1,4 @@
/* Copyright (C) 2017-2019 Andreas Shimokawa, Carsten Pfeiffer, Matthieu /* Copyright (C) 2017-2019 Andreas Shimokawa, Carsten Pfeiffer
Baerts, Roi Greenberg
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,5 +1,5 @@
/* Copyright (C) 2017-2019 Andreas Shimokawa, Carsten Pfeiffer, Matthieu /* Copyright (C) 2017-2019 Andreas Shimokawa, Carsten Pfeiffer, DerFetzer,
Baerts, Roi Greenberg Matthieu Baerts, Roi Greenberg
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2017-2019 Andreas Shimokawa, Carsten Pfeiffer /* Copyright (C) 2017-2019 Andreas Shimokawa, Daniele Gobbetti
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,5 +1,4 @@
/* Copyright (C) 2017-2019 Andreas Shimokawa, Carsten Pfeiffer, Matthieu /* Copyright (C) 2017-2019 Andreas Shimokawa, Carsten Pfeiffer
Baerts, Roi Greenberg
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2017-2019 Andreas Shimokawa, Carsten Pfeiffer /* Copyright (C) 2017-2019 Andreas Shimokawa, Daniele Gobbetti
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,3 +1,19 @@
/* Copyright (C) 2019 Andreas Shimokawa, Manuel Ruß
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.amazfitgts; package nodomain.freeyourgadget.gadgetbridge.service.devices.huami.amazfitgts;
import android.content.Context; import android.content.Context;

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2017-2019 Andreas Shimokawa, Carsten Pfeiffer /* Copyright (C) 2017-2019 Andreas Shimokawa, Daniele Gobbetti
This file is part of Gadgetbridge. This file is part of Gadgetbridge.
@ -40,11 +40,13 @@ public class MiBand4FirmwareInfo extends HuamiFirmwareInfo {
crcToVersion.put(8969, "1.0.5.22"); crcToVersion.put(8969, "1.0.5.22");
crcToVersion.put(43437, "1.0.5.66"); crcToVersion.put(43437, "1.0.5.66");
crcToVersion.put(31632, "1.0.6.00"); crcToVersion.put(31632, "1.0.6.00");
crcToVersion.put(6856, "1.0.7.14");
// resources // resources
crcToVersion.put(27412, "1.0.5.22"); crcToVersion.put(27412, "1.0.5.22");
crcToVersion.put(5466, "1.0.5.66"); crcToVersion.put(5466, "1.0.5.66");
crcToVersion.put(20047, "1.0.6.00"); crcToVersion.put(20047, "1.0.6.00");
crcToVersion.put(62914, "1.0.7.14");
// font // font
crcToVersion.put(31978, "1"); crcToVersion.put(31978, "1");

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2017-2019 Andreas Shimokawa /* Copyright (C) 2017-2019 Andreas Shimokawa, Carsten Pfeiffer
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,5 +1,5 @@
/* Copyright (C) 2017-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele /* Copyright (C) 2017-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele
Gobbetti Gobbetti, vanous
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,5 +1,4 @@
/* Copyright (C) 2016-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele /* Copyright (C) 2019 Andreas Shimokawa
Gobbetti
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,3 +1,19 @@
/* Copyright (C) 2019 Andreas Shimokawa, Cre3per
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/>. */
// TODO: All the commands that aren't supported by GB should be added to device specific settings. // TODO: All the commands that aren't supported by GB should be added to device specific settings.
// TODO: It'd be cool if we could change the language. There's no official way to do so, but the // TODO: It'd be cool if we could change the language. There's no official way to do so, but the

View File

@ -1,4 +1,5 @@
/* Copyright (C) 2019 Andreas Shimokawa /* Copyright (C) 2016-2019 Andreas Shimokawa, Carsten Pfeiffer, Sebastian
Kranz
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,4 +1,5 @@
/* Copyright (C) 2018-2019 jcrode, Johann C. Rode, Sergio Lopez /* Copyright (C) 2018-2019 Carsten Pfeiffer, jcrode, Johann C. Rode,
Sergio Lopez
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2018-2019 Johann C. Rode, Sergio Lopez /* Copyright (C) 2018-2019 Carsten Pfeiffer, Johann C. Rode, Sergio Lopez
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2018-2019 Sergio Lopez /* Copyright (C) 2018-2019 Carsten Pfeiffer, Sergio Lopez
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2018-2019 Johann C. Rode /* Copyright (C) 2018-2019 Carsten Pfeiffer, Johann C. Rode
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,3 +1,19 @@
/* Copyright (C) 2019 Matej Drobnič
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.pebble; package nodomain.freeyourgadget.gadgetbridge.service.devices.pebble;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;

View File

@ -1,5 +1,5 @@
/* Copyright (C) 2015-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele /* Copyright (C) 2015-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele
Gobbetti, Julien Pivotto, Uwe Hermann Gobbetti, Julien Pivotto, Matej Drobnič, Uwe Hermann
This file is part of Gadgetbridge. This file is part of Gadgetbridge.
@ -28,6 +28,8 @@ import android.webkit.ValueCallback;
import android.webkit.WebView; import android.webkit.WebView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -44,7 +46,6 @@ import java.nio.ByteBuffer;
import java.nio.ByteOrder; import java.nio.ByteOrder;
import java.util.UUID; import java.util.UUID;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.activities.ExternalPebbleJSActivity; import nodomain.freeyourgadget.gadgetbridge.activities.ExternalPebbleJSActivity;
@ -110,7 +111,7 @@ class PebbleIoThread extends GBDeviceIoThread {
} }
} }
public static void sendAppMessage(GBDeviceEventAppMessage message) { private static void sendAppMessage(GBDeviceEventAppMessage message) {
final String jsEvent; final String jsEvent;
try { try {
WebViewSingleton.getInstance().checkAppRunning(message.appUUID); WebViewSingleton.getInstance().checkAppRunning(message.appUUID);
@ -190,7 +191,7 @@ class PebbleIoThread extends GBDeviceIoThread {
mOutStream = new PipedOutputStream(); mOutStream = new PipedOutputStream();
mPebbleLESupport = new PebbleLESupport(this.getContext(), btDevice, (PipedInputStream) mInStream, (PipedOutputStream) mOutStream); mPebbleLESupport = new PebbleLESupport(this.getContext(), btDevice, (PipedInputStream) mInStream, (PipedOutputStream) mOutStream);
} else { } else {
ParcelUuid uuids[] = btDevice.getUuids(); ParcelUuid[] uuids = btDevice.getUuids();
if (uuids == null) { if (uuids == null) {
return false; return false;
} }
@ -364,7 +365,7 @@ class PebbleIoThread extends GBDeviceIoThread {
mInStream.skip(2); mInStream.skip(2);
} }
GBDeviceEvent deviceEvents[] = mPebbleProtocol.decodeResponse(buffer); GBDeviceEvent[] deviceEvents = mPebbleProtocol.decodeResponse(buffer);
if (deviceEvents == null) { if (deviceEvents == null) {
LOG.info("unhandled message to endpoint " + endpoint + " (" + length + " bytes)"); LOG.info("unhandled message to endpoint " + endpoint + " (" + length + " bytes)");
} else { } else {
@ -386,31 +387,9 @@ class PebbleIoThread extends GBDeviceIoThread {
if (e.getMessage() != null && (e.getMessage().equals("broken pipe") || e.getMessage().contains("socket closed"))) { //FIXME: this does not feel right if (e.getMessage() != null && (e.getMessage().equals("broken pipe") || e.getMessage().contains("socket closed"))) { //FIXME: this does not feel right
LOG.info(e.getMessage()); LOG.info(e.getMessage());
mIsConnected = false; mIsConnected = false;
int reconnectAttempts = prefs.getInt("pebble_reconnect_attempts", 10); mBtSocket = null;
if (!mQuit && GBApplication.getGBPrefs().getAutoReconnect() && reconnectAttempts > 0) { LOG.info("Bluetooth socket closed, will quit IO Thread");
gbDevice.setState(GBDevice.State.WAITING_FOR_RECONNECT); break;
gbDevice.sendDeviceUpdateIntent(getContext());
long delaySeconds = 1;
while (reconnectAttempts-- > 0 && !mQuit && !mIsConnected) {
LOG.info("Trying to reconnect (attempts left " + reconnectAttempts + ")");
mIsConnected = connect();
if (!mIsConnected) {
try {
Thread.sleep(delaySeconds * 1000);
} catch (InterruptedException ignored) {
}
if (delaySeconds < 64) {
delaySeconds *= 2;
}
}
}
}
if (!mIsConnected) {
mBtSocket = null;
LOG.info("Bluetooth socket closed, will quit IO Thread");
break;
}
} }
} }
} }
@ -426,7 +405,7 @@ class PebbleIoThread extends GBDeviceIoThread {
enablePebbleKitSupport(false); enablePebbleKitSupport(false);
if (mQuit) { if (mQuit || !GBApplication.getGBPrefs().getAutoReconnect()) {
gbDevice.setState(GBDevice.State.NOT_CONNECTED); gbDevice.setState(GBDevice.State.NOT_CONNECTED);
} else { } else {
gbDevice.setState(GBDevice.State.WAITING_FOR_RECONNECT); gbDevice.setState(GBDevice.State.WAITING_FOR_RECONNECT);

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2017-2019 Andreas Shimokawa /* Copyright (C) 2017-2019 Andreas Shimokawa, Matej Drobnič
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,6 +1,6 @@
/* Copyright (C) 2015-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele /* Copyright (C) 2015-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele
Gobbetti, Frank Slezak, jcrode, Johann C. Rode, Julien Pivotto, Kevin Richter, Gobbetti, Frank Slezak, jcrode, Johann C. Rode, Julien Pivotto, Kevin Richter,
Sergio Lopez, Steffen Liebergeld, Uwe Hermann Matej Drobnič, Sergio Lopez, Steffen Liebergeld, Uwe Hermann
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -0,0 +1,106 @@
/* Copyright (C) 2019 Andreas Shimokawa
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.receivers;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Build;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Calendar;
import nodomain.freeyourgadget.gadgetbridge.BuildConfig;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.devices.DeviceManager;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
import nodomain.freeyourgadget.gadgetbridge.service.DeviceCommunicationService;
public class AutoConnectIntervalReceiver extends BroadcastReceiver {
final DeviceCommunicationService service;
static int mDelay = 4;
private static final Logger LOG = LoggerFactory.getLogger(AutoConnectIntervalReceiver.class);
public AutoConnectIntervalReceiver(DeviceCommunicationService service) {
this.service = service;
IntentFilter filterLocal = new IntentFilter();
filterLocal.addAction(DeviceManager.ACTION_DEVICES_CHANGED);
LocalBroadcastManager.getInstance(service).registerReceiver(this, filterLocal);
}
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action == null) {
return;
}
GBDevice gbDevice = service.getGBDevice();
if (gbDevice == null) {
return;
}
if (action.equals(DeviceManager.ACTION_DEVICES_CHANGED)) {
if (gbDevice.isInitialized()) {
LOG.info("will reset connection delay, device is initialized!");
mDelay = 4;
}
else if (gbDevice.getState() == GBDevice.State.WAITING_FOR_RECONNECT) {
scheduleReconnect();
}
}
else if (action.equals("GB_RECONNECT")) {
if (gbDevice.getState() == GBDevice.State.WAITING_FOR_RECONNECT) {
LOG.info("Will re-connect to " + gbDevice.getAddress() + "(" + gbDevice.getName() + ")");
GBApplication.deviceService().connect();
}
}
}
public void scheduleReconnect() {
mDelay*=2;
if (mDelay > 64) {
mDelay = 64;
}
scheduleReconnect(mDelay);
}
public void scheduleReconnect(int delay) {
LOG.info("scheduling reconnect in " + delay + " seconds");
AlarmManager am = (AlarmManager) (GBApplication.getContext().getSystemService(Context.ALARM_SERVICE));
Intent intent = new Intent("GB_RECONNECT");
intent.setPackage(BuildConfig.APPLICATION_ID);
PendingIntent pendingIntent = PendingIntent.getBroadcast(GBApplication.getContext(), 0, intent, 0);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
am.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, Calendar.getInstance().
getTimeInMillis() + delay * 1000, pendingIntent);
} else {
am.set(AlarmManager.RTC_WAKEUP, Calendar.getInstance().
getTimeInMillis() + delay * 1000, pendingIntent);
}
}
}

View File

@ -1,5 +1,5 @@
/* Copyright (C) 2016-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele /* Copyright (C) 2016-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele
Gobbetti, Felix Konstantin Maurer, Taavi Eomäe Gobbetti, Felix Konstantin Maurer, Marc Nause, Taavi Eomäe, vanous
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2015-2019 Carsten Pfeiffer /* Copyright (C) 2015-2019 Andreas Shimokawa, Carsten Pfeiffer
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,7 +1,7 @@
/* Copyright (C) 2015-2019 0nse, Andreas Böhler, Andreas Shimokawa, Carsten /* Copyright (C) 2015-2019 0nse, Andreas Böhler, Andreas Shimokawa, Carsten
Pfeiffer, Daniele Gobbetti, Jean-François Greffier, João Paulo Barraca, Pfeiffer, Cre3per, Daniele Gobbetti, Jean-François Greffier, João Paulo
José Rebelo, Kranz, ladbsoft, maxirnilian, protomors, Quallenauge, Sami Barraca, José Rebelo, Kranz, ladbsoft, Manuel Ruß, maxirnilian, protomors,
Alaoui, Sophanimus, tiparega, Vadim Kaushan Quallenauge, Sami Alaoui, Sophanimus, tiparega, Vadim Kaushan
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,5 +1,5 @@
/* Copyright (C) 2015-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele /* Copyright (C) 2015-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniel Dakhno,
Gobbetti, Felix Konstantin Maurer, Taavi Eomäe, Uwe Hermann, Yar Daniele Gobbetti, Felix Konstantin Maurer, Taavi Eomäe, Uwe Hermann, Yar
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,5 +1,5 @@
/* Copyright (C) 2017-2019 Alberto, Carsten Pfeiffer, Daniele Gobbetti, /* Copyright (C) 2017-2019 Alberto, Andreas Shimokawa, Carsten Pfeiffer,
Taavi Eomäe Daniele Gobbetti, Taavi Eomäe
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,5 +1,5 @@
/* Copyright (C) 2017-2019 Carsten Pfeiffer, Daniele Gobbetti, João Paulo /* Copyright (C) 2017-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele
Barraca, Roi Greenberg Gobbetti, João Paulo Barraca, Nephiel, Roi Greenberg
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2017-2019 Carsten Pfeiffer, José Rebelo /* Copyright (C) 2017-2019 Andreas Shimokawa, Carsten Pfeiffer, José Rebelo
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2017-2019 Carsten Pfeiffer, José Rebelo /* Copyright (C) 2019 Andreas Shimokawa
This file is part of Gadgetbridge. This file is part of Gadgetbridge.

View File

@ -1,9 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp" android:width="24dp"
android:height="24dp" android:height="24dp"
android:viewportWidth="24.0" android:tint="#7E7E7E"
android:viewportHeight="24.0"> android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path <path
android:fillColor="#FF000000" android:fillColor="#FF000000"
android:pathData="M16,1L4,1c-1.1,0 -2,0.9 -2,2v14h2L4,3h12L16,1zM19,5L8,5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h11c1.1,0 2,-0.9 2,-2L21,7c0,-1.1 -0.9,-2 -2,-2zM19,21L8,21L8,7h11v14z"/> android:pathData="M4,8h4L8,4L4,4v4zM10,20h4v-4h-4v4zM4,20h4v-4L4,16v4zM4,14h4v-4L4,10v4zM10,14h4v-4h-4v4zM16,4v4h4L20,4h-4zM10,8h4L14,4h-4v4zM16,14h4v-4h-4v4zM16,20h4v-4h-4v4z" />
</vector> </vector>

View File

@ -419,4 +419,5 @@
<string name="live_activity_start_your_activity">Стартирайте активност</string> <string name="live_activity_start_your_activity">Стартирайте активност</string>
<string name="title_activity_device_specific_settings">Специфични настройки за устройството</string> <string name="title_activity_device_specific_settings">Специфични настройки за устройството</string>
<string name="average">Средно: %1$s</string> <string name="average">Средно: %1$s</string>
<string name="mi2_prefs_button_press_broadcast_default_value" translatable="false">nodomain.freeyourgadget.gadgetbridge.ButtonPressed</string>
</resources> </resources>

View File

@ -44,14 +44,14 @@
<string name="fw_upgrade_notice">Sou a punt d\'instal·lar el %s.</string> <string name="fw_upgrade_notice">Sou a punt d\'instal·lar el %s.</string>
<string name="fw_upgrade_notice_amazfitbip">Esteu a punt d\'instal·lar el microprogramari %s en el vostre Amazfit Bip. <string name="fw_upgrade_notice_amazfitbip">Esteu a punt d\'instal·lar el microprogramari %s en el vostre Amazfit Bip.
\n \n
\nSi us plau, assegure-vos d\'instal·lar el fitxer .fw, el fitxer .res i, finalment, el fitxer .gps. El vostre rellotge reiniciarà després d\'instal·lar l\'arxiu .fw. \nSi us plau, assegureu-vos d\'instal·lar el fitxer .fw, el fitxer .res i, finalment, el fitxer .gps. El vostre rellotge es reiniciarà després d\'instal·lar l\'arxiu .fw.
\n \n
\nNota: no heu d\'instal·lar els fitxers .res i .gps si aquests fitxers són exactament els mateixos que els prèviament instal·lats. \nNota: no heu d\'instal·lar els fitxers .res i .gps si aquests fitxers són exactament els mateixos que els prèviament instal·lats.
\n \n
\nPROCEDIU SOTA LA VOSTRA PRÒPIA RESPONSABILITAT!</string> \nPROCEDIU SOTA LA VOSTRA PRÒPIA RESPONSABILITAT!</string>
<string name="fw_upgrade_notice_amazfitcor">Sou a punt d\'instal·lar el microprogramari %s en el vostre Amazfit Cor. <string name="fw_upgrade_notice_amazfitcor">Sou a punt d\'instal·lar el microprogramari %s en la vostra Amazfit Cor.
\n \n
\nSi us plau, assegure-vos d\'instal·lar el fitxer .fw i el fitxer .res. La vostra polsera reiniciarà després d\'instal·lar l\'arxiu .fw. \nSi us plau, assegureu-vos d\'instal·lar el fitxer .fw, i després el fitxer .res. La vostra polsera es reiniciarà després d\'instal·lar el fitxer .fw.
\n \n
\nNota: no heu d\'instal·lar el fitxer .res si és exactament el mateix que el prèviament instal·lat. \nNota: no heu d\'instal·lar el fitxer .res si és exactament el mateix que el prèviament instal·lat.
\n \n
@ -253,7 +253,7 @@
<string name="stats_y_axis_label">Passes per minut</string> <string name="stats_y_axis_label">Passes per minut</string>
<string name="control_center_find_lost_device">Troba l\'aparell perdut</string> <string name="control_center_find_lost_device">Troba l\'aparell perdut</string>
<string name="control_center_cancel_to_stop_vibration">Cancel·leu per aturar la vibració.</string> <string name="control_center_cancel_to_stop_vibration">Cancel·leu per aturar la vibració.</string>
<string name="title_activity_charts">La vostra activitat</string> <string name="title_activity_charts">Activitat i son</string>
<string name="title_activity_set_alarm">Configura les alarmes</string> <string name="title_activity_set_alarm">Configura les alarmes</string>
<string name="controlcenter_start_configure_alarms">Configura les alarmes</string> <string name="controlcenter_start_configure_alarms">Configura les alarmes</string>
<string name="title_activity_alarm_details">Detalls d\'alarma</string> <string name="title_activity_alarm_details">Detalls d\'alarma</string>
@ -282,11 +282,11 @@
<string name="notif_battery_low_bigtext_last_charge_time">Darrera càrrega: %s</string> <string name="notif_battery_low_bigtext_last_charge_time">Darrera càrrega: %s</string>
<string name="notif_battery_low_bigtext_number_of_charges">Nombre de càrregues: %s</string> <string name="notif_battery_low_bigtext_number_of_charges">Nombre de càrregues: %s</string>
<string name="notif_export_failed_title">L\'exportació de la base de dades ha fallat! Si us plau, comproveu la configuració.</string> <string name="notif_export_failed_title">L\'exportació de la base de dades ha fallat! Si us plau, comproveu la configuració.</string>
<string name="sleepchart_your_sleep">El vostre son</string> <string name="sleepchart_your_sleep">Son</string>
<string name="weeksleepchart_sleep_a_week">Son per setmana</string> <string name="weeksleepchart_sleep_a_week">Son per setmana</string>
<string name="weeksleepchart_today_sleep_description">Son avui, objectiu: %1$s</string> <string name="weeksleepchart_today_sleep_description">Son avui, objectiu: %1$s</string>
<string name="weekstepschart_steps_a_week">Passes per setmana</string> <string name="weekstepschart_steps_a_week">Passes per setmana</string>
<string name="activity_sleepchart_activity_and_sleep">La vostra activitat i el vostre son</string> <string name="activity_sleepchart_activity_and_sleep">Activitat</string>
<string name="updating_firmware">El microprogramari s\'està instal·lant…</string> <string name="updating_firmware">El microprogramari s\'està instal·lant…</string>
<string name="fwapp_install_device_not_ready">No es pot instal·lar el fitxer. L\'aparell no està preparat.</string> <string name="fwapp_install_device_not_ready">No es pot instal·lar el fitxer. L\'aparell no està preparat.</string>
<string name="installhandler_firmware_name">%1$s: %2$s %3$s</string> <string name="installhandler_firmware_name">%1$s: %2$s %3$s</string>
@ -333,7 +333,7 @@
<string name="dateformat_time">Temps</string> <string name="dateformat_time">Temps</string>
<string name="dateformat_date_time">Hora i data</string> <string name="dateformat_date_time">Hora i data</string>
<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ó de la Mi Band 2</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 la difusió de missatge</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>
@ -388,7 +388,7 @@
<string name="pref_summary_pebble_gatt_clientonly">Això només és per a Pebble 2 i és experimental. Proveu-ho si teniu problemes de connexió</string> <string name="pref_summary_pebble_gatt_clientonly">Això només és per a Pebble 2 i és experimental. Proveu-ho si teniu problemes de connexió</string>
<string name="fw_upgrade_notice_miband3">Sou a punt d\'instal·lar el microprogramari %s en la vostra Mi Band 3. <string name="fw_upgrade_notice_miband3">Sou a punt d\'instal·lar el microprogramari %s en la vostra Mi Band 3.
\n \n
\nSi us plau, assegureu-vos d\'instal·lar el fitxer .fw, i després el fitxer .res. El vostre rellotge es reiniciarà després d\'instal·lar el fitxer .fw. \nSi us plau, assegureu-vos d\'instal·lar el fitxer .fw, i després el fitxer .res. La vostra polsera es reiniciarà després d\'instal·lar el fitxer .fw.
\n \n
\nObservació: No cal que instal·leu el fitxer .res si és exactament el mateix que ja estava instal·lat. \nObservació: No cal que instal·leu el fitxer .res si és exactament el mateix que ja estava instal·lat.
\n \n
@ -418,7 +418,7 @@
<string name="zetime_analog_mode_hands">Només mans</string> <string name="zetime_analog_mode_hands">Només mans</string>
<string name="zetime_analog_mode_handsandsteps">Mans i passes</string> <string name="zetime_analog_mode_handsandsteps">Mans i passes</string>
<string name="pref_title_support_voip_calls">Activa les trucades de VoIP</string> <string name="pref_title_support_voip_calls">Activa les trucades de VoIP</string>
<string name="fw_upgrade_notice_amazfitcor2">Sou a punt d\'instal·lar el microprogramari %s en el vostre Amazfit Cor 2. <string name="fw_upgrade_notice_amazfitcor2">Sou a punt d\'instal·lar el microprogramari %s en la vostra Amazfit Cor 2.
\n \n
\nSi us plau, assegureu-vos d\'instal·lar el fitxer .fw, i després el fitxer .res. La vostra polsera es reiniciarà després d\'instal·lar el fitxer .fw. \nSi us plau, assegureu-vos d\'instal·lar el fitxer .fw, i després el fitxer .res. La vostra polsera es reiniciarà després d\'instal·lar el fitxer .fw.
\n \n
@ -701,4 +701,95 @@
<string name="portuguese">Portuguès</string> <string name="portuguese">Portuguès</string>
<string name="devicetype_amazfit_cor2">Amazfit Cor 2</string> <string name="devicetype_amazfit_cor2">Amazfit Cor 2</string>
<string name="devicetype_miband4">Mi Band 4</string> <string name="devicetype_miband4">Mi Band 4</string>
<string name="mi2_prefs_button_press_broadcast_default_value" translatable="false">nodomain.freeyourgadget.gadgetbridge.ButtonPressed</string>
<string name="fw_upgrade_notice_miband4">Esteu a punt d\'instal·lar el microprogramari %s en la vostra Mi Band 4.
\n
\nSi us plau, assegureu-vos d\'instal·lar el fitxer .fw, i després el fitxer .res. La vostra polsera es reiniciarà després d\'instal·lar l\'arxiu .fw.
\n
\nNota: no heu d\'instal·lar el fitxer .res si és exactament el mateix que ja estava instal·lat.
\n
\nPROCEDIU SOTA LA VOSTRA PRÒPIA RESPONSABILITAT!</string>
<string name="prefs_hr_alarm_low">Límit baix</string>
<string name="prefs_hr_alarm_high">Límit alt</string>
<string name="average">Mitjana: %1$s</string>
<string name="pref_header_charts">Configuració dels gràfics</string>
<string name="pref_title_charts_average">Mostra mitjanes als gràfics</string>
<string name="pref_title_charts_range">Rang dels gràfics</string>
<string name="weekstepschart_steps_a_month">Passes per mes</string>
<string name="weeksleepchart_sleep_a_month">Son per mes</string>
<string name="devicetype_mijia_lywsd02">Mijia Smart Clock</string>
<string name="menuitem_nfc">NFC</string>
<string name="pref_summary_expose_hr">Permet altres aplicacions accedir a les dades de freqüència cardíaca en temps real mentre Gadgetbridge estigui connectat</string>
<string name="pref_title_expose_hr">Accés a tercers a freqüència cardíaca en temps real</string>
<string name="pref_title_use_custom_font">Utilitza un tipus de lletra personalitzat</string>
<string name="pref_summary_use_custom_font">Activa-ho si el vostre dispositiu inclou microprogramari de tipus de lletra personalitzat amb suport per a emojis</string>
<string name="activity_db_management_autoexport_label">Exportació automàtica</string>
<string name="activity_DB_ExportButton">Exporta BD</string>
<string name="activity_DB_import_button">Importa BD</string>
<string name="activity_DB_test_export_button">Executa l\'exportació automàtica ara</string>
<string name="activity_DB_test_export_message">Exportant base de dades…</string>
<string name="activity_DB_delete_legacy_button">Esborra BD antiga</string>
<string name="activity_DB_empty_button">Buida la BD</string>
<string name="appwidget_sleep_alarm_widget_label">Alarma de son</string>
<string name="widget_steps_label">Passes: %1$02d</string>
<string name="widget_sleep_label">Son: %1$s</string>
<string name="widget_listing_label">Estat i alarmes</string>
<string name="widget_5_minutes">5 minuts</string>
<string name="widget_10_minutes">10 minuts</string>
<string name="widget_20_minutes">20 minuts</string>
<string name="widget_1_hour">1 hora</string>
<plurals name="widget_alarm_target_hours">
<item quantity="one">%d hora</item>
<item quantity="other">%d hores</item>
</plurals>
<string name="pref_display_add_device_fab">Botó d\'afegir nou dispositiu</string>
<string name="pref_display_add_device_fab_on">Sempre visible</string>
<string name="pref_display_add_device_fab_off">Visible només si no hi ha cap dispositiu afegit</string>
<string name="preferences_makibes_hr3_settings">Configuració de Makibes HR3</string>
<string name="devicetype_makibes_hr3">Makibes HR3</string>
<string name="devicetype_amazfit_bip_lite">Amazfit Bip Lite</string>
<string name="prefs_find_phone">Troba el telèfon</string>
<string name="prefs_enable_find_phone">Activa «Troba el telèfon»</string>
<string name="prefs_find_phone_duration">Duració del to en segons</string>
<string name="maximum_duration">Durada</string>
<string name="fw_upgrade_notice_amazfitbip_lite">Esteu a punt d\'instal·lar el microprogramari %s en el vostre Amazfit Bip Lite.
\n
\nSi us plau, assegureu-vos d\'instal·lar el fitxer .fw, i després el fitxer .res. El vostre rellotge es reiniciarà després d\'instal·lar l\'arxiu .fw.
\n
\nNota: no heu d\'instal·lar el fitxer .res si és exactament el mateix que ja estava instal·lat.
\n
\nPROCEDIU SOTA LA VOSTRA PRÒPIA RESPONSABILITAT!</string>
<string name="devicetype_amazfit_gtr">Amazfit GTR</string>
<string name="fw_upgrade_notice_amazfitgtr">Esteu a punt d\'instal·lar el microprogramari %s en el vostre Amazfit GTR.
\n
\nSi us plau, assegureu-vos d\'instal·lar el fitxer .fw, el fitxer .res i, finalment, el fitxer .gps. El vostre rellotge es reiniciarà després d\'instal·lar l\'arxiu .fw.
\n
\nNota: no heu d\'instal·lar els fitxers .res i .gps si aquests fitxers són exactament els mateixos que els prèviament instal·lats.
\n
\nPROCEDIU SOTA LA VOSTRA PRÒPIA RESPONSABILITAT!</string>
<string name="pref_chart_heartrate_color_red">Vermell</string>
<string name="pref_chart_heartrate_color_orange">Taronja</string>
<string name="pref_title_chart_heartrate_color">Color de freqüència cardíaca</string>
<string name="pref_title_chart_sleep_rolling_24_hour">Interval de son</string>
<string name="pref_chart_sleep_rolling_24_on">Últimes 24 hores</string>
<string name="pref_chart_sleep_rolling_24_off">De migdia a migdia</string>
<string name="devicetype_amazfit_gts">Amazfit GTS</string>
<string name="fw_upgrade_notice_amazfitgts">Esteu a punt d\'instal·lar el microprogramari %s en el vostre Amazfit GTS.
\n
\nSi us plau, assegureu-vos d\'instal·lar el fitxer .fw, el fitxer .res i, finalment, el fitxer .gps. El vostre rellotge es reiniciarà després d\'instal·lar l\'arxiu .fw.
\n
\nNota: no heu d\'instal·lar els fitxers .res i .gps si aquests fitxers són exactament els mateixos que els prèviament instal·lats.
\n
\nPROCEDIU SOTA LA VOSTRA PRÒPIA RESPONSABILITAT!</string>
<string name="prefs_hr_alarm_activity">Alarma de freqüència cardíaca durant activitat esportiva</string>
<string name="pref_charts_range_on">El rang dels gràfics està configurat a un mes</string>
<string name="pref_charts_range_off">El rang dels gràfics està configurat a una setmana</string>
<string name="activity_db_management_autoexport_explanation">La ubicació de l\'exportació automàtica s\'ha definit a:</string>
<string name="activity_db_management_empty_DB">Buida la base de dades</string>
<string name="activity_db_management_exportimport_label">Exportar i importar</string>
<string name="activity_db_management_empty_db_warning">Atenció! En prémer aquest botó esborrareu tota la base de dades i començareu de zero.</string>
<string name="widget_set_alarm_after">Fixa una alarma al cap de:</string>
<string name="activity_error_no_app_for_gpx">Per a veure la traça d\'activitat, instal·leu una app que pugui manejar fitxers GPX.</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>
</resources> </resources>

View File

@ -408,7 +408,7 @@
<string name="discovery_yes_pair">Párovat</string> <string name="discovery_yes_pair">Párovat</string>
<string name="discovery_dont_pair">Nepárovat</string> <string name="discovery_dont_pair">Nepárovat</string>
<string name="mi2_prefs_button_actions">Akce tlačítka</string> <string name="mi2_prefs_button_actions">Akce tlačítka</string>
<string name="mi2_prefs_button_actions_summary">Nastavení akcí po stisknutí tlačítka Mi Band 2</string> <string name="mi2_prefs_button_actions_summary">Nastavení akcí po stisknutí tlačítka</string>
<string name="mi2_prefs_button_press_count">Počet stisknutí tlačítka</string> <string name="mi2_prefs_button_press_count">Počet stisknutí tlačítka</string>
<string name="mi2_prefs_button_press_count_summary">Počet stisknutí tlačítka na spuštění vysílání zpráv</string> <string name="mi2_prefs_button_press_count_summary">Počet stisknutí tlačítka na spuštění vysílání zpráv</string>
<string name="mi2_prefs_button_press_broadcast">Vysílání zpráv</string> <string name="mi2_prefs_button_press_broadcast">Vysílání zpráv</string>
@ -791,4 +791,5 @@
\nPoznámka: Nemusíte instalovat soubor .res a .gps, pokud jsou stejné jako soubory nainstalovány dříve. \nPoznámka: Nemusíte instalovat soubor .res a .gps, pokud jsou stejné jako soubory nainstalovány dříve.
\n \n
\nPOKRAČUJTE NA VLASTNÍ NEBEZPEČÍ!</string> \nPOKRAČUJTE NA VLASTNÍ NEBEZPEČÍ!</string>
<string name="mi2_prefs_button_press_broadcast_default_value" translatable="false">nodomain.freeyourgadget.gadgetbridge.ButtonPressed</string>
</resources> </resources>

View File

@ -426,7 +426,7 @@
\n \n
\nINSTALLATION AUF EIGENE GEFAHR!</string> \nINSTALLATION AUF EIGENE GEFAHR!</string>
<string name="mi2_prefs_button_actions">Tastenaktionen</string> <string name="mi2_prefs_button_actions">Tastenaktionen</string>
<string name="mi2_prefs_button_actions_summary">Bestimmte Aktion bei Tastendruck auf dem Mi Band 2</string> <string name="mi2_prefs_button_actions_summary">Festlegen der Tastendruckaktionen</string>
<string name="mi2_prefs_button_press_count_summary">Anzahl der Tastendrücke, um die Nachrichtenübertragung auszulösen</string> <string name="mi2_prefs_button_press_count_summary">Anzahl der Tastendrücke, um die Nachrichtenübertragung auszulösen</string>
<string name="mi2_prefs_button_press_broadcast">Zu sendende Nachricht</string> <string name="mi2_prefs_button_press_broadcast">Zu sendende Nachricht</string>
<string name="mi2_prefs_button_action">Aktiviere Tastenaktion</string> <string name="mi2_prefs_button_action">Aktiviere Tastenaktion</string>
@ -802,4 +802,5 @@
\nHinweis: Du musst die .res und .gps nicht installieren, wenn diese Dateien genau die gleichen sind wie die zuvor installierten. \nHinweis: Du musst die .res und .gps nicht installieren, wenn diese Dateien genau die gleichen sind wie die zuvor installierten.
\n \n
\nINSTALLATION AUF EIGENE GEFAHR!</string> \nINSTALLATION AUF EIGENE GEFAHR!</string>
<string name="mi2_prefs_button_press_broadcast_default_value" translatable="false">nodomain.freeyourgadget.gadgetbridge.ButtonPressed</string>
</resources> </resources>

View File

@ -747,4 +747,5 @@
<string name="widget_10_minutes">10 λεπτά</string> <string name="widget_10_minutes">10 λεπτά</string>
<string name="widget_20_minutes">20 λεπτά</string> <string name="widget_20_minutes">20 λεπτά</string>
<string name="widget_1_hour">1 ώρα</string> <string name="widget_1_hour">1 ώρα</string>
<string name="mi2_prefs_button_press_broadcast_default_value" translatable="false">nodomain.freeyourgadget.gadgetbridge.ButtonPressed</string>
</resources> </resources>

View File

@ -108,7 +108,7 @@
<string name="pref_title_enable_outgoing_call">Soporte para llamadas salientes</string> <string name="pref_title_enable_outgoing_call">Soporte para llamadas salientes</string>
<string name="pref_summary_enable_outgoing_call">Desactivar esto evitará que el Pebble 2/LE vibre en llamadas salientes</string> <string name="pref_summary_enable_outgoing_call">Desactivar esto evitará que el Pebble 2/LE vibre en llamadas salientes</string>
<string name="pref_title_enable_pebblekit">Permitir el acceso a aplicaciones Android de terceros</string> <string name="pref_title_enable_pebblekit">Permitir el acceso a aplicaciones Android de terceros</string>
<string name="pref_summary_enable_pebblekit">habilitar el soporte experimental para aplicaciones Android que usan PebbleKit</string> <string name="pref_summary_enable_pebblekit">Habilitar el soporte experimental para aplicaciones Android que usan PebbleKit</string>
<string name="pref_header_pebble_timeline">Timeline Pebble</string> <string name="pref_header_pebble_timeline">Timeline Pebble</string>
<string name="pref_title_sunrise_sunset">Salida y puesta de Sol</string> <string name="pref_title_sunrise_sunset">Salida y puesta de Sol</string>
<string name="pref_summary_sunrise_sunset">Enviar las horas de salida y puesta de Sol basándose en la localización a la timeline del Pebble</string> <string name="pref_summary_sunrise_sunset">Enviar las horas de salida y puesta de Sol basándose en la localización a la timeline del Pebble</string>
@ -231,7 +231,7 @@
<string name="stats_y_axis_label">Pasos por minuto</string> <string name="stats_y_axis_label">Pasos por minuto</string>
<string name="control_center_find_lost_device">Encuentra un dispositivo perdido</string> <string name="control_center_find_lost_device">Encuentra un dispositivo perdido</string>
<string name="control_center_cancel_to_stop_vibration">Cancelar para detener la vibración.</string> <string name="control_center_cancel_to_stop_vibration">Cancelar para detener la vibración.</string>
<string name="title_activity_charts">Tu actividad</string> <string name="title_activity_charts">Actividad y sueño</string>
<string name="title_activity_set_alarm">Configurar alarmas</string> <string name="title_activity_set_alarm">Configurar alarmas</string>
<string name="controlcenter_start_configure_alarms">Configurar alarmas</string> <string name="controlcenter_start_configure_alarms">Configurar alarmas</string>
<string name="title_activity_alarm_details">Detalles de alarma</string> <string name="title_activity_alarm_details">Detalles de alarma</string>
@ -259,11 +259,11 @@
<string name="notif_battery_low_percent">A %1$s le queda: %2$s%% batería</string> <string name="notif_battery_low_percent">A %1$s le queda: %2$s%% batería</string>
<string name="notif_battery_low_bigtext_last_charge_time">Última carga: %s \n</string> <string name="notif_battery_low_bigtext_last_charge_time">Última carga: %s \n</string>
<string name="notif_battery_low_bigtext_number_of_charges">Número de cargas: %s</string> <string name="notif_battery_low_bigtext_number_of_charges">Número de cargas: %s</string>
<string name="sleepchart_your_sleep">Tu sueño</string> <string name="sleepchart_your_sleep">Sueño</string>
<string name="weeksleepchart_sleep_a_week">Sueño por semana</string> <string name="weeksleepchart_sleep_a_week">Sueño por semana</string>
<string name="weeksleepchart_today_sleep_description">Sueño hoy, objetivo: %1$s</string> <string name="weeksleepchart_today_sleep_description">Sueño hoy, objetivo: %1$s</string>
<string name="weekstepschart_steps_a_week">Pasos por semana</string> <string name="weekstepschart_steps_a_week">Pasos por semana</string>
<string name="activity_sleepchart_activity_and_sleep">Tu actividad y sueño</string> <string name="activity_sleepchart_activity_and_sleep">Actividad</string>
<string name="updating_firmware">Instalando firmware…</string> <string name="updating_firmware">Instalando firmware…</string>
<string name="fwapp_install_device_not_ready">El archivo no puede ser instalado, el dispositivo no está listo.</string> <string name="fwapp_install_device_not_ready">El archivo no puede ser instalado, el dispositivo no está listo.</string>
<string name="installhandler_firmware_name">%1$s: %2$s %3$s</string> <string name="installhandler_firmware_name">%1$s: %2$s %3$s</string>
@ -291,7 +291,7 @@
<string name="pref_summary_dont_ack_transfers">Si los datos no son marcados como descargados, no serán borrados de tu Mi Band. Útil si Gadgetbridge se usa conjuntamente con otras apps.</string> <string name="pref_summary_dont_ack_transfers">Si los datos no son marcados como descargados, no serán borrados de tu Mi Band. Útil si Gadgetbridge se usa conjuntamente con otras apps.</string>
<string name="pref_summary_keep_data_on_device">Mantendrá los datos de actividad en la Mi Band incluso después de la sincronización. Útil si GB se usa junto con otras apps.</string> <string name="pref_summary_keep_data_on_device">Mantendrá los datos de actividad en la Mi Band incluso después de la sincronización. Útil si GB se usa junto con otras apps.</string>
<string name="pref_title_low_latency_fw_update">Usa el modo de baja latencia para las instalaciones de firmware</string> <string name="pref_title_low_latency_fw_update">Usa el modo de baja latencia para las instalaciones de firmware</string>
<string name="pref_summary_low_latency_fw_update">Esto podría ayudar en dispositivos donde las instalaciones de firmware fallan</string> <string name="pref_summary_low_latency_fw_update">Esto podría ayudar en dispositivos donde las instalaciones de firmware fallan.</string>
<string name="live_activity_steps_history">Historial de pasos</string> <string name="live_activity_steps_history">Historial de pasos</string>
<string name="live_activity_current_steps_per_minute">Pasos/min actuales</string> <string name="live_activity_current_steps_per_minute">Pasos/min actuales</string>
<string name="live_activity_total_steps">Pasos totales</string> <string name="live_activity_total_steps">Pasos totales</string>
@ -348,7 +348,7 @@
<string name="charts_legend_heartrate">Ritmo cardíaco</string> <string name="charts_legend_heartrate">Ritmo cardíaco</string>
<string name="live_activity_heart_rate">Ritmo cardíaco</string> <string name="live_activity_heart_rate">Ritmo cardíaco</string>
<string name="pref_title_pebble_health_store_raw">Almacenar datos en bruto en la base de datos </string> <string name="pref_title_pebble_health_store_raw">Almacenar datos en bruto en la base de datos </string>
<string name="pref_summary_pebble_health_store_raw">Una vez seleccionado, los datos archivados se guardan en bruto y están disponibles para ser interpretados más tarde. Nota: ¡La base de datos será más grande!</string> <string name="pref_summary_pebble_health_store_raw">Guarda los datos en bruto para poder ser interpretados más tarde, esto incrementa el tamaño de la base de datos.</string>
<string name="action_db_management">Administración de bases de datos</string> <string name="action_db_management">Administración de bases de datos</string>
<string name="title_activity_db_management">Administración de bases de datos</string> <string name="title_activity_db_management">Administración de bases de datos</string>
<string name="activity_db_management_import_export_explanation">La base de datos usa la siguiente ubicación en su dispositivo.\nEsta ubicación está accesible para otras aplicaciones Android y para su ordenador.\nEncontrará sus bases de datos exportadas (o la que quiere importar) aquí:</string> <string name="activity_db_management_import_export_explanation">La base de datos usa la siguiente ubicación en su dispositivo.\nEsta ubicación está accesible para otras aplicaciones Android y para su ordenador.\nEncontrará sus bases de datos exportadas (o la que quiere importar) aquí:</string>
@ -377,7 +377,7 @@
<string name="title_activity_vibration">Vibración</string> <string name="title_activity_vibration">Vibración</string>
<!--Strings related to Pebble Pairing Activity--> <!--Strings related to Pebble Pairing Activity-->
<string name="title_activity_pebble_pairing">Emparejando con Pebble</string> <string name="title_activity_pebble_pairing">Emparejando con Pebble</string>
<string name="pebble_pairing_hint">En su dispositivo Android aparecerá un mensaje para emparejar. Si no aparece, mira en el cajón de notificaciones y acepta la propuesta de emparejamiento. Después acepta también en tu Pebble</string> <string name="pebble_pairing_hint">En su dispositivo Android aparecerá un mensaje para emparejar. Si no aparece, mira en el cajón de notificaciones y acepta la propuesta de emparejamiento. Después acepta también en tu Pebble.</string>
<string name="weather_notification_label">Asegúrate de que este tema esté activado en la aplicación de notificación del tiempo para obtener la información en tu Pebble.\n\nNo se requiere configuración.\n\nPuedes activar la aplicación del tiempo del sistema desde la configuración de la app.\n\nLas watchfaces soportadas mostrarán la información del tiempo automáticamente.</string> <string name="weather_notification_label">Asegúrate de que este tema esté activado en la aplicación de notificación del tiempo para obtener la información en tu Pebble.\n\nNo se requiere configuración.\n\nPuedes activar la aplicación del tiempo del sistema desde la configuración de la app.\n\nLas watchfaces soportadas mostrarán la información del tiempo automáticamente.</string>
<string name="pref_title_setup_bt_pairing">Activar el emparejamiento Bluetooth</string> <string name="pref_title_setup_bt_pairing">Activar el emparejamiento Bluetooth</string>
<string name="pref_summary_setup_bt_pairing">Desactiva esto si tienes problemas de conexión</string> <string name="pref_summary_setup_bt_pairing">Desactiva esto si tienes problemas de conexión</string>
@ -418,7 +418,6 @@
<string name="mi2_prefs_button_press_count_summary">Número de presiones para activar el envío del mensaje</string> <string name="mi2_prefs_button_press_count_summary">Número de presiones para activar el envío del mensaje</string>
<string name="mi2_prefs_button_press_broadcast">Mensaje para enviar</string> <string name="mi2_prefs_button_press_broadcast">Mensaje para enviar</string>
<string name="mi2_prefs_button_press_broadcast_summary">Enviar mensaje después de un número definido de pulsaciones</string> <string name="mi2_prefs_button_press_broadcast_summary">Enviar mensaje después de un número definido de pulsaciones</string>
<string name="mi2_prefs_button_press_broadcast_default_value">nodomain.freeyourgadget.gadgetbridge.mibandButtonPressed</string>
<string name="mi2_prefs_button_action">Activar acción por botón</string> <string name="mi2_prefs_button_action">Activar acción por botón</string>
<string name="mi2_prefs_button_action_summary">Activar acción por un número definido de pulsaciones</string> <string name="mi2_prefs_button_action_summary">Activar acción por un número definido de pulsaciones</string>
<string name="mi2_prefs_button_action_vibrate">Activar la vibración de la pulsera</string> <string name="mi2_prefs_button_action_vibrate">Activar la vibración de la pulsera</string>
@ -663,15 +662,15 @@
<string name="title_activity_device_specific_settings">Configuraciones específicas del dispositivo</string> <string name="title_activity_device_specific_settings">Configuraciones específicas del dispositivo</string>
<string name="pref_title_authkey">Clave de autenticación</string> <string name="pref_title_authkey">Clave de autenticación</string>
<string name="pref_summary_authkey">Cambie la clave de autenticación a una clave común en todos sus dispositivos Android desde los que desea conectarse. La clave predeterminada anterior para todos los dispositivos es 0123456789@ABCDE</string> <string name="pref_summary_authkey">Cambie la clave de autenticación a una clave común en todos sus dispositivos Android desde los que desea conectarse. La clave predeterminada anterior para todos los dispositivos es 0123456789@ABCDE</string>
<string name="fw_upgrade_notice_amazfitcor2">Está a punto de instalar el «firmware» %s en su Amazfit Cor 2. <string name="fw_upgrade_notice_amazfitcor2">Está a punto de instalar el firmware %s en su Amazfit Cor 2.
\n \n
\nAsegúrese de instalar el archivo .fw y, a continuación, el archivo .res. Se reiniciará la pulsera tras instalar el archivo .fw. \nAsegúrese de instalar el archivo .fw y, a continuación, el archivo .res. La pulsera se reiniciará despues de instalar el archivo .fw.
\n \n
\nNota: no es necesario instalar el archivo .res si es idéntico al instalado previamente. \nNota: no es necesario instalar el archivo .res si es idéntico al instalado previamente.
\n \n
\nPROCEDA BAJO SU PROPIA CUENTA Y RIESGO. \nPROCEDA BAJO SU PROPIO RIESGO.
\n \n
\nNO SE HA REALIZADO NINGUNA PRUEBA. QUIZÁ NECESITE INSTALAR UN «FIRMWARE» BEATS_W SI EL NOMBRE DE SU DISPOSITIVO ES «Amazfit Band 2»</string> \nNO SE HA REALIZADO NINGUNA PRUEBA. QUIZÁ NECESITE INSTALAR UN FIRMWARE BEATS_W SI EL NOMBRE DE SU DISPOSITIVO ES \"Amazfit Band 2\"</string>
<string name="fw_upgrade_notice_miband4">Está a punto de instalar el «firmware» %s en su Mi Band 4. <string name="fw_upgrade_notice_miband4">Está a punto de instalar el «firmware» %s en su Mi Band 4.
\n \n
\nAsegúrese de instalar el archivo .fw y, a continuación, el archivo .res. Se reiniciará la pulsera tras instalar el archivo .fw. \nAsegúrese de instalar el archivo .fw y, a continuación, el archivo .res. Se reiniciará la pulsera tras instalar el archivo .fw.
@ -774,4 +773,18 @@
<string name="pref_title_chart_sleep_rolling_24_hour">Intervalo de sueño</string> <string name="pref_title_chart_sleep_rolling_24_hour">Intervalo de sueño</string>
<string name="pref_chart_sleep_rolling_24_on">Últimas 24 horas</string> <string name="pref_chart_sleep_rolling_24_on">Últimas 24 horas</string>
<string name="pref_chart_sleep_rolling_24_off">De mediodía a mediodía</string> <string name="pref_chart_sleep_rolling_24_off">De mediodía a mediodía</string>
<string name="appwidget_sleep_alarm_widget_label">Alarma de sueño</string>
<string name="widget_sleep_label">Sueño: %1$s</string>
<string name="pref_display_add_device_fab">Botón de añadir nuevo dispositivo</string>
<string name="devicetype_makibes_hr3">Makibes HR3</string>
<string name="devicetype_amazfit_bip_lite">Amazfit Bip Lite</string>
<string name="devicetype_amazfit_gtr">Amazfit GTR</string>
<string name="devicetype_amazfit_gts">Amazfit GTS</string>
<string name="fw_upgrade_notice_amazfitgts">Está a punto de instalar el firmware %s en su Amazfit GTS.
\n
\nPor favor, asegúrese de instalar el archivo .fw primero, el archivo .res a continuación y por ultimo el archivo .gps. Su reloj se reiniciara después de instalar el archivo .fw.
\n
\nNota: No hace falta instalar los archivos .res y .gps si los archivos son idénticos a los previamente instalados.
\n
\n¡PROCEDE BAJO TU PROPIO RIESGO!</string>
</resources> </resources>

View File

@ -278,4 +278,5 @@
<string name="mi2_prefs_button_action_vibrate_summary">Luba värin nupu abil</string> <string name="mi2_prefs_button_action_vibrate_summary">Luba värin nupu abil</string>
<string name="title_activity_vibration">Värin</string> <string name="title_activity_vibration">Värin</string>
<string name="reset_index">Lähtesta impordi aeg</string> <string name="reset_index">Lähtesta impordi aeg</string>
<string name="mi2_prefs_button_press_broadcast_default_value" translatable="false">nodomain.freeyourgadget.gadgetbridge.ButtonPressed</string>
</resources> </resources>

View File

@ -124,4 +124,5 @@
<string name="pref_title_weather">هواشناسی</string> <string name="pref_title_weather">هواشناسی</string>
<string name="pref_title_weather_location">مکان تعیین شده برای هواشناسی (CM/LOS)</string> <string name="pref_title_weather_location">مکان تعیین شده برای هواشناسی (CM/LOS)</string>
<string name="pref_blacklist">اضافه کردن برنامه‌ها به لیست سیاه</string> <string name="pref_blacklist">اضافه کردن برنامه‌ها به لیست سیاه</string>
<string name="mi2_prefs_button_press_broadcast_default_value" translatable="false">nodomain.freeyourgadget.gadgetbridge.ButtonPressed</string>
</resources> </resources>

View File

@ -1,9 +1,9 @@
<?xml version='1.0' encoding='UTF-8'?> <?xml version="1.0" encoding="utf-8"?>
<resources><string name="action_settings">Asetukset</string> <resources>
<string name="action_settings">Asetukset</string>
<string name="controlcenter_fetch_activity_data">Synkronisoi</string> <string name="controlcenter_fetch_activity_data">Synkronisoi</string>
<string name="controlcenter_find_device">Löydä kadonnut laite</string> <string name="controlcenter_find_device">Löydä kadonnut laite</string>
<string name="app_name">Gadgetbridge</string> <string name="app_name">Gadgetbridge</string>
<string name="title_activity_controlcenter">Gadgetbridge</string> <string name="title_activity_controlcenter">Gadgetbridge</string>
<string name="action_quit">Sulje</string> <string name="action_quit">Sulje</string>
<string name="action_donate">Lahjoita</string> <string name="action_donate">Lahjoita</string>
@ -18,8 +18,6 @@
<string name="controlcenter_snackbar_disconnecting">Yhteyttä katkaistaan</string> <string name="controlcenter_snackbar_disconnecting">Yhteyttä katkaistaan</string>
<string name="controlcenter_snackbar_connecting">Yhdistetään</string> <string name="controlcenter_snackbar_connecting">Yhdistetään</string>
<string name="controlcenter_snackbar_requested_screenshot">Otataan ruutukaappausta laitteesta</string> <string name="controlcenter_snackbar_requested_screenshot">Otataan ruutukaappausta laitteesta</string>
<string name="title_activity_appmanager">Sovellusten hallinta</string> <string name="title_activity_appmanager">Sovellusten hallinta</string>
<string name="appmanager_cached_watchapps_watchfaces">Välimuistissa olevat sovellukset</string> <string name="appmanager_cached_watchapps_watchfaces">Välimuistissa olevat sovellukset</string>
<string name="appmanager_installed_watchapps">Asennetut sovellukset</string> <string name="appmanager_installed_watchapps">Asennetut sovellukset</string>
@ -37,5 +35,5 @@
<string name="appmanager_weather_install_provider">Asenna sääilmoitussovellus</string> <string name="appmanager_weather_install_provider">Asenna sääilmoitussovellus</string>
<string name="app_configure">Määritä</string> <string name="app_configure">Määritä</string>
<string name="app_move_to_top">Siirrä ylös</string> <string name="app_move_to_top">Siirrä ylös</string>
<string name="mi2_prefs_button_press_broadcast_default_value" translatable="false">nodomain.freeyourgadget.gadgetbridge.ButtonPressed</string>
</resources> </resources>

Some files were not shown because too many files have changed in this diff Show More