1
0
mirror of https://codeberg.org/Freeyourgadget/Gadgetbridge synced 2024-06-25 06:21:04 +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
#### 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
* Amazfit GTS: Initial and incomplete support, mostly untested
* 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)
* 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 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
* Casio GB-6900B
* HPlus Devices (e.g. ZeBand) [Wiki](https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/HPlus)

View File

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

View File

@ -46,6 +46,9 @@ import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
@ -103,7 +106,7 @@ public class GBApplication extends Application {
private static SharedPreferences sharedPrefs;
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
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 Prefs prefs;
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) {
SharedPreferences.Editor editor = sharedPrefs.edit();
if (oldVersion == 0) {
@ -684,7 +739,7 @@ public class GBApplication extends Application {
switch (deviceType) {
case MIBAND:
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;
case AMAZFITCOR:
displayItems = prefs.getStringSet("cor_display_items", null);
@ -825,6 +880,14 @@ public class GBApplication extends Application {
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.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.

View File

@ -1,5 +1,5 @@
/* 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.

View File

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

View File

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

View File

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

View File

@ -1,6 +1,6 @@
/* Copyright (C) 2015-2019 0nse, Andreas Shimokawa, Carsten Pfeiffer,
Daniele Gobbetti, Felix Konstantin Maurer, José Rebelo, Martin, Normano64,
Pavel Elagin, Sebastian Kranz
Pavel Elagin, Sebastian Kranz, vanous
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;
import android.app.Activity;

View File

@ -1,5 +1,5 @@
/* 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.

View File

@ -1,5 +1,5 @@
/* 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.

View File

@ -1,5 +1,5 @@
/* Copyright (C) 2015-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele
Gobbetti, Pavel Elagin, Vebryn
Gobbetti, Pavel Elagin, vanous, Vebryn
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;
import android.graphics.Canvas;

View File

@ -1,5 +1,5 @@
/* Copyright (C) 2015-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele
Gobbetti, Vebryn
Gobbetti, vanous, Vebryn
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.

View File

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

View File

@ -1,5 +1,5 @@
/* Copyright (C) 2015-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele
Gobbetti, Dikay900, Pavel, Pavel Elagin
/* Copyright (C) 2015-2019 Andreas Shimokawa, Carsten Pfeiffer, Cre3per,
Daniele Gobbetti, Dikay900, Pavel, Pavel Elagin
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;
import java.util.ArrayList;

View File

@ -1,5 +1,5 @@
/* 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.

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.

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.

View File

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

View File

@ -1,5 +1,4 @@
/* Copyright (C) 2018-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele
Gobbetti
/* Copyright (C) 2019 Andreas Shimokawa
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;
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;
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.

View File

@ -1,5 +1,5 @@
/* 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.

View File

@ -1,5 +1,5 @@
/* 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.

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.

View File

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

View File

@ -1,5 +1,5 @@
/* 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.

View File

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

View File

@ -1,5 +1,5 @@
/* Copyright (C) 2017-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele
Gobbetti, João Paulo Barraca
/* Copyright (C) 2017-2019 Andreas Shimokawa, Daniele Gobbetti, João
Paulo Barraca, José Rebelo, tiparega
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;
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.

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.

View File

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

View File

@ -1,5 +1,4 @@
/* Copyright (C) 2016-2019 Andreas Shimokawa, Carsten Pfeiffer, João
Paulo Barraca
/* Copyright (C) 2019 Andreas Shimokawa, Cre3per
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.

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.

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.

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.

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.

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.

View File

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

View File

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

View File

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

View File

@ -1,6 +1,6 @@
/* Copyright (C) 2016-2019 Andreas Shimokawa, AnthonyDiGirolamo, Daniele
Gobbetti, Frank Slezak, Kaz Wolfe, Kevin Richter, Lukas Veneziano, Matthieu
Baerts, michaelneu, NotAFIle, Tomas Radej
Gobbetti, Frank Slezak, Kaz Wolfe, Kevin Richter, Lukas Veneziano, Marvin D,
Matthieu Baerts, michaelneu, NotAFIle, Tomas Radej
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.

View File

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

View File

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

View File

@ -1,8 +1,8 @@
/* Copyright (C) 2015-2019 Andreas Shimokawa, Avamander, Carsten Pfeiffer,
dakhnod, Daniele Gobbetti, Daniel Hauck, Dikay900, Frank Slezak, ivanovlev,
João Paulo Barraca, José Rebelo, Julien Pivotto, Kasha, Martin, Matthieu
Baerts, Sebastian Kranz, Sergey Trofimov, Steffen Liebergeld, Taavi Eomäe,
Uwe Hermann
/* Copyright (C) 2015-2019 Andreas Böhler, Andreas Shimokawa, Avamander,
Carsten Pfeiffer, dakhnod, Daniele Gobbetti, Daniel Hauck, Dikay900, Frank
Slezak, ivanovlev, João Paulo Barraca, José Rebelo, Julien Pivotto, Kasha,
keeshii, Martin, Matthieu Baerts, Nephiel, Sebastian Kranz, Sergey Trofimov,
Steffen Liebergeld, Taavi Eomäe, Uwe Hermann
This file is part of Gadgetbridge.
@ -44,14 +44,12 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Random;
import java.util.UUID;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.activities.HeartRateUtils;
import nodomain.freeyourgadget.gadgetbridge.devices.DeviceCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiCoordinator;
import nodomain.freeyourgadget.gadgetbridge.externalevents.AlarmClockReceiver;
import nodomain.freeyourgadget.gadgetbridge.externalevents.AlarmReceiver;
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.NotificationType;
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
import nodomain.freeyourgadget.gadgetbridge.service.receivers.AutoConnectIntervalReceiver;
import nodomain.freeyourgadget.gadgetbridge.service.receivers.GBAutoFetchReceiver;
import nodomain.freeyourgadget.gadgetbridge.util.DeviceHelper;
import nodomain.freeyourgadget.gadgetbridge.util.EmojiConverter;
import nodomain.freeyourgadget.gadgetbridge.util.GB;
import nodomain.freeyourgadget.gadgetbridge.util.GBPrefs;
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_APP_CONFIGURE;
@ -193,6 +191,7 @@ public class DeviceCommunicationService extends Service implements SharedPrefere
private BluetoothPairingRequestReceiver mBlueToothPairingRequestReceiver = null;
private AlarmClockReceiver mAlarmClockReceiver = null;
private GBAutoFetchReceiver mGBAutoFetchReceiver = null;
private AutoConnectIntervalReceiver mAutoConnectInvervalReceiver= null;
private AlarmReceiver mAlarmReceiver = null;
private CalendarReceiver mCalendarReceiver = null;
@ -760,6 +759,10 @@ public class DeviceCommunicationService extends Service implements SharedPrefere
mGBAutoFetchReceiver = new GBAutoFetchReceiver();
registerReceiver(mGBAutoFetchReceiver, new IntentFilter("android.intent.action.USER_PRESENT"));
}
if (mAutoConnectInvervalReceiver == null) {
mAutoConnectInvervalReceiver= new AutoConnectIntervalReceiver(this);
registerReceiver(mAutoConnectInvervalReceiver, new IntentFilter("GB_RECONNECT"));
}
} else {
if (mPhoneCallReceiver != null) {
unregisterReceiver(mPhoneCallReceiver);
@ -809,6 +812,10 @@ public class DeviceCommunicationService extends Service implements SharedPrefere
unregisterReceiver(mGBAutoFetchReceiver);
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
Pfeiffer, criogenic, Daniele Gobbetti, Jean-François Greffier, João Paulo
Barraca, José Rebelo, Kranz, ladbsoft, maxirnilian, protomors, Quallenauge,
Sami Alaoui, Sergey Trofimov, Sophanimus, tiparega, Vadim Kaushan
Pfeiffer, Cre3per, criogenic, Daniele Gobbetti, Jean-François Greffier,
João Paulo Barraca, José Rebelo, Kranz, ladbsoft, Manuel Ruß, maxirnilian,
protomors, Quallenauge, Sami Alaoui, Sergey Trofimov, Sophanimus, tiparega,
Vadim Kaushan
This file is part of Gadgetbridge.

View File

@ -1,5 +1,5 @@
/* 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.
@ -49,6 +49,7 @@ import nodomain.freeyourgadget.gadgetbridge.Logging;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice.State;
import nodomain.freeyourgadget.gadgetbridge.service.DeviceSupport;
import nodomain.freeyourgadget.gadgetbridge.service.receivers.AutoConnectIntervalReceiver;
/**
* One queue/thread per connectable device.
@ -301,8 +302,6 @@ public final class BtLEQueue {
mWaitForServerActionResultLatch.countDown();
}
boolean wasInitialized = mGbDevice.isInitialized();
setDeviceConnectionState(State.NOT_CONNECTED);
// 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.
// Not sure if this actually works without re-initializing the device...
if (mBluetoothGatt != null) {
if (!wasInitialized || !maybeReconnect()) {
if (!maybeReconnect()) {
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.content.Context;
import androidx.annotation.NonNull;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
public class SetDeviceStateAction extends PlainAction {
@ -43,6 +45,7 @@ public class SetDeviceStateAction extends PlainAction {
return context;
}
@NonNull
@Override
public String toString() {
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.

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.getNotificationPrefIntValue;
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 {
@ -706,7 +707,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
protected void onAlarmClock(NotificationSpec notificationSpec) {
alarmClockRinging = true;
AbortTransactionAction abortAction = new StopNotificationAction(getCharacteristic(GattCharacteristic.UUID_CHARACTERISTIC_ALERT_LEVEL)) {
AbortTransactionAction abortAction = new StopNotificationAction(getCharacteristic(UUID_CHARACTERISTIC_ALERT_LEVEL)) {
@Override
protected boolean shouldAbort() {
return !isAlarmClockRinging();
@ -739,7 +740,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
public void onSetCallState(CallSpec callSpec) {
if (callSpec.command == CallSpec.CALL_INCOMING) {
telephoneRinging = true;
AbortTransactionAction abortAction = new StopNotificationAction(getCharacteristic(GattCharacteristic.UUID_CHARACTERISTIC_ALERT_LEVEL)) {
AbortTransactionAction abortAction = new StopNotificationAction(getCharacteristic(UUID_CHARACTERISTIC_ALERT_LEVEL)) {
@Override
protected boolean shouldAbort() {
return !isTelephoneRinging();
@ -1083,8 +1084,20 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
// not supported
}
public void runButtonAction() {
Prefs prefs = GBApplication.getPrefs();
// this could go though onion code with preferrednotification, but I this should work on all huami devices
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) {
return;
@ -1099,7 +1112,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
LOG.info("Sending " + requiredButtonPressMessage + " with button_id " + currentButtonActionId);
this.getContext().getApplicationContext().sendBroadcast(in);
if (prefs.getBoolean(HuamiConst.PREF_BUTTON_ACTION_VIBRATE, false)) {
performPreferredNotification(null, null, null, HuamiService.ALERT_LEVEL_VIBRATE_ONLY, null);
vibrateOnce();
}
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.
@ -158,10 +158,10 @@ public class AmazfitBipFirmwareInfo extends HuamiFirmwareInfo {
crcToVersion.put(59577, "9 (Latin)");
// BipOS FW
crcToVersion.put(28373, "1.1.5.02 (BipOS 0.5)");
crcToVersion.put(28373, "1.1.2.05 (BipOS 0.5)");
// 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) {

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.

View File

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

View File

@ -1,5 +1,5 @@
/* Copyright (C) 2017-2019 Andreas Shimokawa, Carsten Pfeiffer, Matthieu
Baerts, Roi Greenberg
/* Copyright (C) 2017-2019 Andreas Shimokawa, Carsten Pfeiffer, DerFetzer,
Matthieu Baerts, Roi Greenberg
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.

View File

@ -1,5 +1,4 @@
/* Copyright (C) 2017-2019 Andreas Shimokawa, Carsten Pfeiffer, Matthieu
Baerts, Roi Greenberg
/* Copyright (C) 2017-2019 Andreas Shimokawa, Carsten Pfeiffer
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.

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;
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.
@ -40,11 +40,13 @@ public class MiBand4FirmwareInfo extends HuamiFirmwareInfo {
crcToVersion.put(8969, "1.0.5.22");
crcToVersion.put(43437, "1.0.5.66");
crcToVersion.put(31632, "1.0.6.00");
crcToVersion.put(6856, "1.0.7.14");
// resources
crcToVersion.put(27412, "1.0.5.22");
crcToVersion.put(5466, "1.0.5.66");
crcToVersion.put(20047, "1.0.6.00");
crcToVersion.put(62914, "1.0.7.14");
// font
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.

View File

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

View File

@ -1,5 +1,4 @@
/* Copyright (C) 2016-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele
Gobbetti
/* Copyright (C) 2019 Andreas Shimokawa
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: 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.

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.

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.

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.

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.

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;
import androidx.annotation.NonNull;

View File

@ -1,5 +1,5 @@
/* 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.
@ -28,6 +28,8 @@ import android.webkit.ValueCallback;
import android.webkit.WebView;
import androidx.annotation.NonNull;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -44,7 +46,6 @@ import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.UUID;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.R;
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;
try {
WebViewSingleton.getInstance().checkAppRunning(message.appUUID);
@ -190,7 +191,7 @@ class PebbleIoThread extends GBDeviceIoThread {
mOutStream = new PipedOutputStream();
mPebbleLESupport = new PebbleLESupport(this.getContext(), btDevice, (PipedInputStream) mInStream, (PipedOutputStream) mOutStream);
} else {
ParcelUuid uuids[] = btDevice.getUuids();
ParcelUuid[] uuids = btDevice.getUuids();
if (uuids == null) {
return false;
}
@ -364,7 +365,7 @@ class PebbleIoThread extends GBDeviceIoThread {
mInStream.skip(2);
}
GBDeviceEvent deviceEvents[] = mPebbleProtocol.decodeResponse(buffer);
GBDeviceEvent[] deviceEvents = mPebbleProtocol.decodeResponse(buffer);
if (deviceEvents == null) {
LOG.info("unhandled message to endpoint " + endpoint + " (" + length + " bytes)");
} 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
LOG.info(e.getMessage());
mIsConnected = false;
int reconnectAttempts = prefs.getInt("pebble_reconnect_attempts", 10);
if (!mQuit && GBApplication.getGBPrefs().getAutoReconnect() && reconnectAttempts > 0) {
gbDevice.setState(GBDevice.State.WAITING_FOR_RECONNECT);
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;
}
mBtSocket = null;
LOG.info("Bluetooth socket closed, will quit IO Thread");
break;
}
}
}
@ -426,7 +405,7 @@ class PebbleIoThread extends GBDeviceIoThread {
enablePebbleKitSupport(false);
if (mQuit) {
if (mQuit || !GBApplication.getGBPrefs().getAutoReconnect()) {
gbDevice.setState(GBDevice.State.NOT_CONNECTED);
} else {
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.

View File

@ -1,6 +1,6 @@
/* Copyright (C) 2015-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele
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.

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
Gobbetti, Felix Konstantin Maurer, Taavi Eomäe
Gobbetti, Felix Konstantin Maurer, Marc Nause, Taavi Eomäe, vanous
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.

View File

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

View File

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

View File

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

View File

@ -1,5 +1,5 @@
/* Copyright (C) 2017-2019 Carsten Pfeiffer, Daniele Gobbetti, João Paulo
Barraca, Roi Greenberg
/* Copyright (C) 2017-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele
Gobbetti, João Paulo Barraca, Nephiel, Roi Greenberg
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.

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.

View File

@ -1,9 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
android:width="24dp"
android:height="24dp"
android:tint="#7E7E7E"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
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>

View File

@ -419,4 +419,5 @@
<string name="live_activity_start_your_activity">Стартирайте активност</string>
<string name="title_activity_device_specific_settings">Специфични настройки за устройството</string>
<string name="average">Средно: %1$s</string>
<string name="mi2_prefs_button_press_broadcast_default_value" translatable="false">nodomain.freeyourgadget.gadgetbridge.ButtonPressed</string>
</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_amazfitbip">Esteu a punt d\'instal·lar el microprogramari %s en el vostre Amazfit Bip.
\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
\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="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
\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
\nNota: no heu d\'instal·lar el fitxer .res si és exactament el mateix que el prèviament instal·lat.
\n
@ -253,7 +253,7 @@
<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_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="controlcenter_start_configure_alarms">Configura les alarmes</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_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="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_today_sleep_description">Son avui, objectiu: %1$s</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="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>
@ -333,7 +333,7 @@
<string name="dateformat_time">Temps</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_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_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>
@ -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="fw_upgrade_notice_miband3">Sou a punt d\'instal·lar el microprogramari %s en la vostra Mi Band 3.
\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
\nObservació: No cal que instal·leu el fitxer .res si és exactament el mateix que ja estava instal·lat.
\n
@ -418,7 +418,7 @@
<string name="zetime_analog_mode_hands">Només mans</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="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
\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
@ -701,4 +701,95 @@
<string name="portuguese">Portuguès</string>
<string name="devicetype_amazfit_cor2">Amazfit Cor 2</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>

View File

@ -408,7 +408,7 @@
<string name="discovery_yes_pair">Pá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_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_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>
@ -791,4 +791,5 @@
\nPoznámka: Nemusíte instalovat soubor .res a .gps, pokud jsou stejné jako soubory nainstalovány dříve.
\n
\nPOKRAČUJTE NA VLASTNÍ NEBEZPEČÍ!</string>
<string name="mi2_prefs_button_press_broadcast_default_value" translatable="false">nodomain.freeyourgadget.gadgetbridge.ButtonPressed</string>
</resources>

View File

@ -426,7 +426,7 @@
\n
\nINSTALLATION AUF EIGENE GEFAHR!</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_broadcast">Zu sendende Nachricht</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.
\n
\nINSTALLATION AUF EIGENE GEFAHR!</string>
<string name="mi2_prefs_button_press_broadcast_default_value" translatable="false">nodomain.freeyourgadget.gadgetbridge.ButtonPressed</string>
</resources>

View File

@ -747,4 +747,5 @@
<string name="widget_10_minutes">10 λεπτά</string>
<string name="widget_20_minutes">20 λεπτά</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>

View File

@ -108,7 +108,7 @@
<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_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_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>
@ -231,7 +231,7 @@
<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_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="controlcenter_start_configure_alarms">Configurar alarmas</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_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="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_today_sleep_description">Sueño hoy, objetivo: %1$s</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="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>
@ -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_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_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_current_steps_per_minute">Pasos/min actuales</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="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_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="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>
@ -377,7 +377,7 @@
<string name="title_activity_vibration">Vibración</string>
<!--Strings related to Pebble Pairing Activity-->
<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="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>
@ -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_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_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_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>
@ -663,15 +662,15 @@
<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_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.
\n
\nAsegúrese de instalar el archivo .fw y, a continuación, el archivo .res. Se reiniciará la pulsera tras instalar el archivo .fw.
\n
<string name="fw_upgrade_notice_amazfitcor2">Está a punto de instalar el firmware %s en su Amazfit Cor 2.
\n
\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
\nNota: no es necesario instalar el archivo .res si es idéntico al instalado previamente.
\n
\nPROCEDA BAJO SU PROPIA CUENTA Y RIESGO.
\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>
\n
\nPROCEDA BAJO SU PROPIO RIESGO.
\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>
<string name="fw_upgrade_notice_miband4">Está a punto de instalar el «firmware» %s en su Mi Band 4.
\n
\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_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="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>

View File

@ -278,4 +278,5 @@
<string name="mi2_prefs_button_action_vibrate_summary">Luba värin nupu abil</string>
<string name="title_activity_vibration">Värin</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>

View File

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

View File

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

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