1
0
mirror of https://codeberg.org/Freeyourgadget/Gadgetbridge synced 2024-06-16 10:00:08 +02:00

Merge branch 'master' into fossil-q-hr

This commit is contained in:
Andreas Shimokawa 2020-02-05 10:59:26 +01:00
commit 15a090b35e
52 changed files with 1157 additions and 40 deletions

View File

@ -1,5 +1,10 @@
### Changelog
#### WIP
* Initial iTag support
* Fix indefinitely lasting bluetooth scans when location permission has not been granted
* Try to stop incoming VoIP call notification when the call is answered
#### Version 0.41.1
* Huami: allow to have alarms without snooze feature
* Mi Band 2: Properly stop a call notification when text notifications are disabled

View File

@ -43,7 +43,7 @@ public class GBDaoGenerator {
public static void main(String[] args) throws Exception {
Schema schema = new Schema(23, MAIN_PACKAGE + ".entities");
Schema schema = new Schema(24, MAIN_PACKAGE + ".entities");
Entity userAttributes = addUserAttributes(schema);
Entity user = addUserInfo(schema, userAttributes);

View File

@ -38,6 +38,7 @@ vendor's servers.
* Casio GB-6900B
* Fossil Q Hybrid
* HPlus Devices (e.g. ZeBand) [Wiki](https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/HPlus)
* iTag
* ID115
* JYou Y5
* Lenovo Watch 9
@ -83,6 +84,7 @@ Please see [FEATURES.md](https://codeberg.org/Freeyourgadget/Gadgetbridge/src/ma
* Daniel Dakhno (Fossil Q Hybrid)
* Gordon Williams (Bangle.js)
* Pavel Elagin (JYou Y5)
* Taavi Eomäe (iTag)
## Contribute

View File

@ -9,9 +9,26 @@
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Pebble BG-JS
-keepclassmembers class * {
@android.webkit.JavascriptInterface <methods>;
}
-keepclassmembers class nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.webview.JSInterface {
public *;
}
-keepattributes JavascriptInterface
# https://github.com/tony19/logback-android/issues/29
-dontwarn javax.mail.**, javax.naming.Context, javax.naming.InitialContext
# To avoid any stacktrace ambiguity
-keepattributes SourceFile,LineNumberTable
# GreenDAO 2 - http://greenrobot.org/greendao/documentation/technical-faq/
-keepclassmembers class * extends de.greenrobot.dao.AbstractDao {
public static java.lang.String TABLENAME;
}
-keep class **$Properties
-keep class **$Properties { *; }

View File

@ -53,6 +53,7 @@ import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -303,7 +304,13 @@ public class DiscoveryActivity extends AbstractGBActivity implements AdapterView
registerReceiver(bluetoothReceiver, bluetoothIntents);
startDiscovery();
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
GB.toast(DiscoveryActivity.this, getString(R.string.error_no_location_access), Toast.LENGTH_SHORT, GB.ERROR);
LOG.error("No permission to access coarse location!");
checkAndRequestLocationPermission();
} else {
startDiscovery();
}
}
@Override
@ -667,6 +674,7 @@ public class DiscoveryActivity extends AbstractGBActivity implements AdapterView
bondingDevice = deviceCandidate;
break;
case BluetoothDevice.BOND_BONDED:
bondingDevice = deviceCandidate;
handleDeviceBonded();
break;
}

View File

@ -22,4 +22,5 @@ public class DeviceSettingsPreferenceConst {
public static final String PREF_WEARLOCATION = "wearlocation";
public static final String PREF_SCREEN_ORIENTATION = "screen_orientation";
public static final String PREF_RESERVER_ALARMS_CALENDAR = "reserve_alarms_calendar";
public static final String PREF_ALLOW_HIGH_MTU = "allow_high_mtu";
}

View File

@ -0,0 +1,35 @@
/* Copyright (C) 2017-2020 Andreas Shimokawa, protomors
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.database.schema;
import android.database.sqlite.SQLiteDatabase;
import nodomain.freeyourgadget.gadgetbridge.database.DBHelper;
import nodomain.freeyourgadget.gadgetbridge.database.DBUpdateScript;
import nodomain.freeyourgadget.gadgetbridge.entities.AlarmDao;
public class GadgetbridgeUpdate_24 implements DBUpdateScript {
@Override
public void upgradeSchema(SQLiteDatabase db) {
// Probably it isbetter to hardcode then using constants since constants could change after refactoring and potentially break migration
db.execSQL("UPDATE DEVICE SET Type=170 where (Type=80 and Manufacturer like 'Fossil%')");
}
@Override
public void downgradeSchema(SQLiteDatabase db) {
}
}

View File

@ -97,7 +97,8 @@ public class MiBand4Coordinator extends HuamiCoordinator {
R.xml.devicesettings_liftwrist_display,
R.xml.devicesettings_swipeunlock,
R.xml.devicesettings_expose_hr_thirdparty,
R.xml.devicesettings_pairingkey
R.xml.devicesettings_pairingkey,
R.xml.devicesettings_high_mtu
};
}

View File

@ -0,0 +1,24 @@
/* Copyright (C) 2020 Taavi Eomäe
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.itag;
import java.util.UUID;
public final class ITagConstants {
public static final UUID UUID_SERVICE_BUTTON = UUID.fromString("0000ffe1-0000-1000-8000-00805f9b34fb"); // Contains information about the button state
public static final UUID UUID_LINK_LOSS_ALERT_LEVEL = UUID.fromString("00002a06-0000-1000-8000-00805f9b34fb"); // Contains information about the button state
}

View File

@ -0,0 +1,137 @@
/* Copyright (C) 2016-2019 Andreas Shimokawa, Carsten Pfeiffer, Daniele Gobbetti, Taavi Eomäe
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.itag;
import android.app.Activity;
import android.content.Context;
import android.net.Uri;
import androidx.annotation.NonNull;
import nodomain.freeyourgadget.gadgetbridge.devices.AbstractDeviceCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.InstallHandler;
import nodomain.freeyourgadget.gadgetbridge.devices.SampleProvider;
import nodomain.freeyourgadget.gadgetbridge.entities.DaoSession;
import nodomain.freeyourgadget.gadgetbridge.entities.Device;
import nodomain.freeyourgadget.gadgetbridge.devices.AbstractDeviceCoordinator;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDeviceCandidate;
import nodomain.freeyourgadget.gadgetbridge.model.ActivitySample;
import nodomain.freeyourgadget.gadgetbridge.model.DeviceType;
public class ITagCoordinator extends AbstractDeviceCoordinator {
@Override
@NonNull
public DeviceType getSupportedType(GBDeviceCandidate candidate) {
String name = candidate.getDevice().getName();
if (name != null && name.toLowerCase().startsWith("itag")) { // All four: iTAG, iTag, ITAG and ITag exist
return DeviceType.ITAG;
}
return DeviceType.UNKNOWN;
}
@Override
public DeviceType getDeviceType() {
return DeviceType.ITAG;
}
@Override
public Class<? extends Activity> getPairingActivity() {
return null;
}
@Override
public InstallHandler findInstallHandler(Uri uri, Context context) {
return null;
}
@Override
public boolean supportsActivityDataFetching() {
return false;
}
@Override
public boolean supportsActivityTracking() {
return false;
}
@Override
public SampleProvider<? extends ActivitySample> getSampleProvider(GBDevice device, DaoSession session) {
return null;
}
@Override
public boolean supportsScreenshots() {
return false;
}
@Override
public int getAlarmSlotCount() {
return 0;
}
@Override
public boolean supportsSmartWakeup(GBDevice device) {
return false;
}
@Override
public boolean supportsHeartRateMeasurement(GBDevice device) {
return false;
}
@Override
public String getManufacturer() {
return "Unspecified"; //TODO: Show chip manufacturer?
}
@Override
public boolean supportsAppsManagement() {
return false;
}
@Override
public Class<? extends Activity> getAppsManagementActivity() {
return null;
}
@Override
public boolean supportsCalendarEvents() {
return false;
}
@Override
public boolean supportsRealtimeData() {
return false; //TODO: RRSI
}
@Override
public boolean supportsWeather() {
return false;
}
@Override
public boolean supportsFindDevice() {
return true;
}
@Override
protected void deleteDevice(@NonNull GBDevice gbDevice, @NonNull Device device, @NonNull DaoSession session) {
// nothing to delete, yet
}
}

View File

@ -116,6 +116,7 @@ public class NotificationListener extends NotificationListenerService {
public static ArrayList<String> notificationStack = new ArrayList<>();
private long activeCallPostTime;
private int mLastCallCommand = CallSpec.CALL_UNDEFINED;
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@ -452,13 +453,20 @@ public class NotificationListener extends NotificationListenerService {
}
Notification noti = sbn.getNotification();
dumpExtras(noti.extras);
boolean callStarted = false;
if(noti.actions != null && noti.actions.length > 0) {
for (Notification.Action action : noti.actions) {
LOG.info("Found call action: " + action.title);
}
if (noti.actions.length == 1) {
LOG.info("There is only one call action, assuming outgoing call and ignoring");
return;
if (mLastCallCommand == CallSpec.CALL_INCOMING) {
LOG.info("There is only one call action and previous state was CALL_INCOMING, assuming call started");
callStarted = true;
} else {
LOG.info("There is only one call action and previous state was not CALL_INCOMING, assuming outgoing call / duplicate notification and ignoring");
// FIXME: is there a way to detect transition CALL_OUTGOING -> CALL_START for more complete VoIP call state tracking?
return;
}
}
/*try {
LOG.info("Executing first action");
@ -481,7 +489,8 @@ public class NotificationListener extends NotificationListenerService {
activeCallPostTime = sbn.getPostTime();
CallSpec callSpec = new CallSpec();
callSpec.number = number;
callSpec.command = CallSpec.CALL_INCOMING;
callSpec.command = callStarted ? CallSpec.CALL_START : CallSpec.CALL_INCOMING;
mLastCallCommand = callSpec.command;
GBApplication.deviceService().onSetCallState(callSpec);
}
@ -653,6 +662,7 @@ public class NotificationListener extends NotificationListenerService {
activeCallPostTime = 0;
CallSpec callSpec = new CallSpec();
callSpec.command = CallSpec.CALL_END;
mLastCallCommand = callSpec.command;
GBApplication.deviceService().onSetCallState(callSpec);
}
// FIXME: DISABLED for now

View File

@ -17,7 +17,7 @@
package nodomain.freeyourgadget.gadgetbridge.model;
public class CallSpec {
public static final int CALL_UNDEFINED = 1;
public static final int CALL_UNDEFINED = 0;
public static final int CALL_ACCEPT = 1;
public static final int CALL_INCOMING = 2;
public static final int CALL_OUTGOING = 3;

View File

@ -52,18 +52,19 @@ public enum DeviceType {
TECLASTH30(60, R.drawable.ic_device_h30_h10, R.drawable.ic_device_h30_h10_disabled, R.string.devicetype_teclast_h30),
Y5(61, R.drawable.ic_device_h30_h10, R.drawable.ic_device_roidmi_disabled, R.string.devicetype_y5),
XWATCH(70, R.drawable.ic_device_default, R.drawable.ic_device_default_disabled, R.string.devicetype_xwatch),
FOSSILQHYBRID(80, R.drawable.ic_device_zetime, R.drawable.ic_device_zetime_disabled, R.string.devicetype_qhybrid),
ZETIME(80, R.drawable.ic_device_zetime, R.drawable.ic_device_zetime_disabled, R.string.devicetype_mykronoz_zetime),
ID115(90, R.drawable.ic_device_h30_h10, R.drawable.ic_device_h30_h10_disabled, R.string.devicetype_id115),
WATCH9(100, R.drawable.ic_device_default, R.drawable.ic_device_default_disabled, R.string.devicetype_watch9),
ROIDMI(110, R.drawable.ic_device_roidmi, R.drawable.ic_device_roidmi_disabled, R.string.devicetype_roidmi),
ROIDMI3(112, R.drawable.ic_device_roidmi, R.drawable.ic_device_roidmi_disabled, R.string.devicetype_roidmi3),
CASIOGB6900(120, R.drawable.ic_device_default, R.drawable.ic_device_default_disabled, R.string.devicetype_casiogb6900),
MISCALE2(131, R.drawable.ic_device_default, R.drawable.ic_device_default_disabled, R.string.devicetype_miscale2),
MISCALE2(131, R.drawable.ic_device_miscale2, R.drawable.ic_device_miscale2_disabled, R.string.devicetype_miscale2),
BFH16(140, R.drawable.ic_device_default, R.drawable.ic_device_default_disabled, R.string.devicetype_bfh16),
MAKIBESHR3(150, R.drawable.ic_device_default, R.drawable.ic_device_hplus_disabled, R.string.devicetype_makibes_hr3),
BANGLEJS(160, R.drawable.ic_device_zetime, R.drawable.ic_device_zetime_disabled, R.string.devicetype_banglejs),
FOSSILQHYBRID(170, R.drawable.ic_device_zetime, R.drawable.ic_device_zetime_disabled, R.string.devicetype_qhybrid),
MIJIA_LYWSD02(200, R.drawable.ic_device_pebble, R.drawable.ic_device_pebble_disabled, R.string.devicetype_mijia_lywsd02),
ITAG(250, R.drawable.ic_device_itag, R.drawable.ic_device_itag_disabled, R.string.devicetype_itag),
VIBRATISSIMO(300, R.drawable.ic_device_lovetoy, R.drawable.ic_device_lovetoy_disabled, R.string.devicetype_vibratissimo),
TEST(1000, R.drawable.ic_device_default, R.drawable.ic_device_default_disabled, R.string.devicetype_test);

View File

@ -44,6 +44,7 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.amazfitgts.Ama
import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.miband3.MiBand3Support;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.miband4.MiBand4Support;
import nodomain.freeyourgadget.gadgetbridge.service.devices.id115.ID115Support;
import nodomain.freeyourgadget.gadgetbridge.service.devices.itag.ITagSupport;
import nodomain.freeyourgadget.gadgetbridge.service.devices.jyou.BFH16DeviceSupport;
import nodomain.freeyourgadget.gadgetbridge.service.devices.jyou.TeclastH30.TeclastH30Support;
import nodomain.freeyourgadget.gadgetbridge.service.devices.liveview.LiveviewSupport;
@ -222,6 +223,9 @@ public class DeviceSupportFactory {
case MAKIBESHR3:
deviceSupport = new ServiceDeviceSupport(new MakibesHR3DeviceSupport(), EnumSet.of(ServiceDeviceSupport.Flags.BUSY_CHECKING));
break;
case ITAG:
deviceSupport = new ServiceDeviceSupport(new ITagSupport(), EnumSet.of(ServiceDeviceSupport.Flags.BUSY_CHECKING));
break;
case BANGLEJS:
deviceSupport = new ServiceDeviceSupport(new BangleJSDeviceSupport(), EnumSet.of(ServiceDeviceSupport.Flags.BUSY_CHECKING));
break;

View File

@ -25,7 +25,6 @@ import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.text.format.DateFormat;
import android.widget.Toast;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
@ -55,7 +54,6 @@ import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.Logging;
import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.activities.SettingsActivity;
import nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst;
import nodomain.freeyourgadget.gadgetbridge.database.DBHandler;
import nodomain.freeyourgadget.gadgetbridge.database.DBHelper;
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventBatteryInfo;
@ -136,6 +134,11 @@ import nodomain.freeyourgadget.gadgetbridge.util.Prefs;
import nodomain.freeyourgadget.gadgetbridge.util.StringUtils;
import nodomain.freeyourgadget.gadgetbridge.util.Version;
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_ALLOW_HIGH_MTU;
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_DATEFORMAT;
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_RESERVER_ALARMS_CALENDAR;
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_TIMEFORMAT;
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_WEARLOCATION;
import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.DEFAULT_VALUE_VIBRATION_COUNT;
import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.DEFAULT_VALUE_VIBRATION_PROFILE;
import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.VIBRATION_COUNT;
@ -1250,6 +1253,10 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
case HuamiDeviceEvent.MTU_REQUEST:
int mtu = (value[2] & 0xff) << 8 | value[1] & 0xff;
LOG.info("device announced MTU of " + mtu);
Prefs prefs = new Prefs(GBApplication.getDeviceSpecificSharedPrefs(gbDevice.getAddress()));
if (!prefs.getBoolean(PREF_ALLOW_HIGH_MTU, false)) {
break;
}
mMTU = mtu;
/*
* not really sure if this would make sense, is this event already a proof of a successful MTU
@ -1673,7 +1680,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
BluetoothGattCharacteristic characteristic = getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION);
Prefs prefs = new Prefs(GBApplication.getDeviceSpecificSharedPrefs(gbDevice.getAddress()));
int availableSlots = prefs.getInt(DeviceSettingsPreferenceConst.PREF_RESERVER_ALARMS_CALENDAR, 0);
int availableSlots = prefs.getInt(PREF_RESERVER_ALARMS_CALENDAR, 0);
if (availableSlots > 0) {
CalendarEvents upcomingEvents = new CalendarEvents();
@ -1747,10 +1754,10 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
case MiBandConst.PREF_SWIPE_UNLOCK:
setBandScreenUnlock(builder);
break;
case DeviceSettingsPreferenceConst.PREF_TIMEFORMAT:
case PREF_TIMEFORMAT:
setTimeFormat(builder);
break;
case DeviceSettingsPreferenceConst.PREF_DATEFORMAT:
case PREF_DATEFORMAT:
setDateFormat(builder);
break;
case HuamiConst.PREF_LANGUAGE:
@ -1759,7 +1766,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
case HuamiConst.PREF_EXPOSE_HR_THIRDPARTY:
setExposeHRThridParty(builder);
break;
case DeviceSettingsPreferenceConst.PREF_WEARLOCATION:
case PREF_WEARLOCATION:
setWearLocation(builder);
break;
}

View File

@ -0,0 +1,303 @@
/* Copyright (C) 2016-2018 Andreas Shimokawa, Carsten Pfeiffer, Taavi Eomäe
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.itag;
import android.bluetooth.BluetoothGatt;
import android.bluetooth.BluetoothGattCharacteristic;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.UUID;
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventBatteryInfo;
import nodomain.freeyourgadget.gadgetbridge.devices.itag.ITagConstants;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
import nodomain.freeyourgadget.gadgetbridge.model.Alarm;
import nodomain.freeyourgadget.gadgetbridge.model.CalendarEventSpec;
import nodomain.freeyourgadget.gadgetbridge.model.CallSpec;
import nodomain.freeyourgadget.gadgetbridge.model.CannedMessagesSpec;
import nodomain.freeyourgadget.gadgetbridge.model.MusicSpec;
import nodomain.freeyourgadget.gadgetbridge.model.MusicStateSpec;
import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
import nodomain.freeyourgadget.gadgetbridge.service.btle.AbstractBTLEDeviceSupport;
import nodomain.freeyourgadget.gadgetbridge.service.btle.GattService;
import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder;
import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.SetDeviceStateAction;
import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.IntentListener;
import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.battery.BatteryInfoProfile;
import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.deviceinfo.DeviceInfoProfile;
public class ITagSupport extends AbstractBTLEDeviceSupport {
private static final Logger LOG = LoggerFactory.getLogger(ITagSupport.class);
private final GBDeviceEventBatteryInfo batteryCmd = new GBDeviceEventBatteryInfo();
private final DeviceInfoProfile<ITagSupport> deviceInfoProfile;
private final BatteryInfoProfile<ITagSupport> batteryInfoProfile;
private final IntentListener mListener = new IntentListener() {
@Override
public void notify(Intent intent) {
String s = intent.getAction();
if (s.equals(DeviceInfoProfile.ACTION_DEVICE_INFO)) {
handleDeviceInfo((nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.deviceinfo.DeviceInfo) intent.getParcelableExtra(DeviceInfoProfile.EXTRA_DEVICE_INFO));
} else if (s.equals(BatteryInfoProfile.ACTION_BATTERY_INFO)) {
handleBatteryInfo((nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.battery.BatteryInfo) intent.getParcelableExtra(BatteryInfoProfile.EXTRA_BATTERY_INFO));
}
}
};
public ITagSupport() {
super(LOG);
addSupportedService(GattService.UUID_SERVICE_GENERIC_ACCESS);
addSupportedService(GattService.UUID_SERVICE_GENERIC_ATTRIBUTE);
addSupportedService(GattService.UUID_SERVICE_BATTERY_SERVICE);
addSupportedService(GattService.UUID_SERVICE_IMMEDIATE_ALERT);
addSupportedService(ITagConstants.UUID_SERVICE_BUTTON);
deviceInfoProfile = new DeviceInfoProfile<>(this);
deviceInfoProfile.addListener(mListener);
batteryInfoProfile = new BatteryInfoProfile<>(this);
batteryInfoProfile.addListener(mListener);
addSupportedProfile(deviceInfoProfile);
addSupportedProfile(batteryInfoProfile);
}
private void handleBatteryInfo(nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.battery.BatteryInfo info) {
batteryCmd.level = (short) info.getPercentCharged();
handleGBDeviceEvent(batteryCmd);
}
@Override
protected TransactionBuilder initializeDevice(TransactionBuilder builder) {
builder.add(new SetDeviceStateAction(getDevice(), GBDevice.State.INITIALIZING, getContext()));
requestDeviceInfo(builder);
setInitialized(builder);
batteryInfoProfile.requestBatteryInfo(builder);
return builder;
}
private void requestDeviceInfo(TransactionBuilder builder) {
LOG.debug("Requesting device info!");
deviceInfoProfile.requestDeviceInfo(builder);
}
private void setInitialized(TransactionBuilder builder) {
builder.add(new SetDeviceStateAction(getDevice(), GBDevice.State.INITIALIZED, getContext()));
}
@Override
public boolean useAutoConnect() {
return true;
}
private void handleDeviceInfo(nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.deviceinfo.DeviceInfo info) {
}
@Override
public void onNotification(NotificationSpec notificationSpec) {
}
@Override
public void onDeleteNotification(int id) {
}
@Override
public void onSetTime() {
}
@Override
public void onSetAlarms(ArrayList<? extends Alarm> alarms) {
}
@Override
public void onSetCallState(CallSpec callSpec) {
}
@Override
public void onSetCannedMessages(CannedMessagesSpec cannedMessagesSpec) {
}
@Override
public void onSetMusicState(MusicStateSpec stateSpec) {
}
@Override
public void onSetMusicInfo(MusicSpec musicSpec) {
}
@Override
public void onEnableRealtimeSteps(boolean enable) {
}
@Override
public void onInstallApp(Uri uri) {
}
@Override
public void onAppInfoReq() {
}
@Override
public void onAppStart(UUID uuid, boolean start) {
}
@Override
public void onAppDelete(UUID uuid) {
}
@Override
public void onAppConfiguration(UUID appUuid, String config, Integer id) {
}
@Override
public void onAppReorder(UUID[] uuids) {
}
@Override
public void onFetchRecordedData(int dataTypes) {
}
@Override
public void onReset(int flags) {
}
@Override
public void onHeartRateTest() {
}
@Override
public void onEnableRealtimeHeartRateMeasurement(boolean enable) {
}
@Override
public void onFindDevice(boolean start) {
onSetConstantVibration(start ? 0x02 : 0x00);
}
@Override
public void onSetConstantVibration(int intensity) {
getQueue().clear();
BluetoothGattCharacteristic characteristic = getCharacteristic(ITagConstants.UUID_LINK_LOSS_ALERT_LEVEL);
TransactionBuilder builder = new TransactionBuilder("beeping");
builder.write(characteristic, new byte[]{(byte) intensity});
builder.queue(getQueue());
}
@Override
public void onScreenshotReq() {
}
@Override
public void onEnableHeartRateSleepSupport(boolean enable) {
}
@Override
public void onSetHeartRateMeasurementInterval(int seconds) {
}
@Override
public void onAddCalendarEvent(CalendarEventSpec calendarEventSpec) {
}
@Override
public void onDeleteCalendarEvent(byte type, long id) {
}
@Override
public boolean onCharacteristicChanged(BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic) {
if (super.onCharacteristicChanged(gatt, characteristic)) {
return true;
}
UUID characteristicUUID = characteristic.getUuid();
LOG.info("Unhandled characteristic changed: " + characteristicUUID);
return false;
}
@Override
public boolean onCharacteristicRead(BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic, int status) {
if (super.onCharacteristicRead(gatt, characteristic, status)) {
return true;
}
UUID characteristicUUID = characteristic.getUuid();
LOG.info("Unhandled characteristic read: " + characteristicUUID);
return false;
}
@Override
public void onSendConfiguration(String config) {
}
@Override
public void onReadConfiguration(String config) {
}
@Override
public void onTestNewFunction() {
}
@Override
public void onSendWeather(WeatherSpec weatherSpec) {
}
}

View File

@ -467,7 +467,7 @@ class PebbleIoThread extends GBDeviceIoThread {
write_real(bytes);
}
// FIXME: parts are supporsed to be generic code
// FIXME: parts are supposed to be generic code
private boolean evaluateGBDeviceEventPebble(GBDeviceEvent deviceEvent) {
if (deviceEvent instanceof GBDeviceEventVersionInfo) {

View File

@ -50,6 +50,7 @@ import nodomain.freeyourgadget.gadgetbridge.devices.hplus.MakibesF68Coordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitbip.AmazfitBipLiteCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitgtr.AmazfitGTRCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitgts.AmazfitGTSCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.itag.ITagCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.makibeshr3.MakibesHR3Coordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.hplus.Q8Coordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitbip.AmazfitBipCoordinator;
@ -240,6 +241,7 @@ public class DeviceHelper {
result.add(new CasioGB6900DeviceCoordinator());
result.add(new BFH16DeviceCoordinator());
result.add(new MijiaLywsd02Coordinator());
result.add(new ITagCoordinator());
result.add(new MakibesHR3Coordinator());
result.add(new BangleJSCoordinator());

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 980 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 992 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

View File

@ -0,0 +1,38 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="26.947369dp"
android:height="26.947369dp"
android:viewportWidth="26.947369"
android:viewportHeight="26.947369">
<path
android:pathData="M3.6116,2.6188L23.3114,2.6188A0.8541,0.8541 0,0 1,24.1655 3.4729L24.1655,22.4136A0.8541,0.8541 0,0 1,23.3114 23.2677L3.6116,23.2677A0.8541,0.8541 0,0 1,2.7575 22.4136L2.7575,3.4729A0.8541,0.8541 0,0 1,3.6116 2.6188z"
android:strokeWidth="0.99516809"
android:fillColor="#6cb8f7"
android:fillAlpha="1"/>
<path
android:pathData="M3.6108,3.3934L23.3107,3.3934A0.8541,0.8541 0,0 1,24.1648 4.2475L24.1648,23.1882A0.8541,0.8541 0,0 1,23.3107 24.0423L3.6108,24.0423A0.8541,0.8541 0,0 1,2.7567 23.1882L2.7567,4.2475A0.8541,0.8541 0,0 1,3.6108 3.3934z"
android:strokeWidth="0.99516809"
android:fillColor="#0c84e3"
android:fillAlpha="1"/>
<path
android:pathData="M3.6099,3.0237L23.3097,3.0237A0.8541,0.8541 0,0 1,24.1638 3.8777L24.1638,22.8185A0.8541,0.8541 0,0 1,23.3097 23.6725L3.6099,23.6725A0.8541,0.8541 0,0 1,2.7558 22.8185L2.7558,3.8777A0.8541,0.8541 0,0 1,3.6099 3.0237z"
android:strokeWidth="0.99516809"
android:fillColor="#2196f3"
android:fillAlpha="1"/>
<path
android:pathData="M11.1493,8.7358L15.7257,8.7358A0.5071,0.5669 0,0 1,16.2328 9.3027L16.2328,17.1386A0.5071,0.5669 0,0 1,15.7257 17.7055L11.1493,17.7055A0.5071,0.5669 0,0 1,10.6422 17.1386L10.6422,9.3027A0.5071,0.5669 0,0 1,11.1493 8.7358z"
android:fillColor="#ffffff"
android:fillAlpha="1"/>
<path
android:pathData="M11.7317,18.4714h3.3818v1.4494h-3.3818z"
android:fillColor="#ffffff"
android:fillAlpha="1"/>
<path
android:pathData="M11.7048,6.4739h3.3818v1.4494h-3.3818z"
android:fillColor="#ffffff"
android:fillAlpha="1"/>
<path
android:pathData="M11.5139,9.729h3.9069v6.9784h-3.9069z"
android:strokeWidth="0.91048878"
android:fillColor="#2196f3"
android:fillAlpha="1"/>
</vector>

View File

@ -0,0 +1,38 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="26.947369dp"
android:height="26.947369dp"
android:viewportWidth="26.947369"
android:viewportHeight="26.947369">
<path
android:pathData="M4.0362,2.923L23.736,2.923A0.8541,0.8541 0,0 1,24.5901 3.7771L24.5901,22.7178A0.8541,0.8541 0,0 1,23.736 23.5719L4.0362,23.5719A0.8541,0.8541 0,0 1,3.1821 22.7178L3.1821,3.7771A0.8541,0.8541 0,0 1,4.0362 2.923z"
android:strokeWidth="0.99516809"
android:fillColor="#a1a1a1"
android:fillAlpha="1"/>
<path
android:pathData="M4.0354,3.6976L23.7353,3.6976A0.8541,0.8541 0,0 1,24.5894 4.5517L24.5894,23.4924A0.8541,0.8541 0,0 1,23.7353 24.3465L4.0354,24.3465A0.8541,0.8541 0,0 1,3.1813 23.4924L3.1813,4.5517A0.8541,0.8541 0,0 1,4.0354 3.6976z"
android:strokeWidth="0.99516809"
android:fillColor="#7d7d7d"
android:fillAlpha="1"/>
<path
android:pathData="M4.0344,3.3278L23.7343,3.3278A0.8541,0.8541 0,0 1,24.5884 4.1819L24.5884,23.1226A0.8541,0.8541 0,0 1,23.7343 23.9767L4.0344,23.9767A0.8541,0.8541 0,0 1,3.1804 23.1226L3.1804,4.1819A0.8541,0.8541 0,0 1,4.0344 3.3278z"
android:strokeWidth="0.99516809"
android:fillColor="#8a8a8a"
android:fillAlpha="1"/>
<path
android:pathData="M11.6209,9.1598L16.1973,9.1598A0.5071,0.5669 0,0 1,16.7044 9.7267L16.7044,17.5625A0.5071,0.5669 0,0 1,16.1973 18.1295L11.6209,18.1295A0.5071,0.5669 0,0 1,11.1138 17.5625L11.1138,9.7267A0.5071,0.5669 0,0 1,11.6209 9.1598z"
android:fillColor="#ffffff"
android:fillAlpha="1"/>
<path
android:pathData="M12.2033,18.8954h3.3818v1.4494h-3.3818z"
android:fillColor="#ffffff"
android:fillAlpha="1"/>
<path
android:pathData="M12.1764,6.8979h3.3818v1.4494h-3.3818z"
android:fillColor="#ffffff"
android:fillAlpha="1"/>
<path
android:pathData="M11.9855,10.1529h3.9069v6.9784h-3.9069z"
android:strokeWidth="0.91048878"
android:fillColor="#8a8a8a"
android:fillAlpha="0.94117647"/>
</vector>

View File

@ -0,0 +1,39 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="26.947369dp"
android:height="26.947369dp"
android:viewportWidth="26.947369"
android:viewportHeight="26.947369">
<path
android:pathData="M3.6116,2.6188L23.3114,2.6188A0.8541,0.8541 0,0 1,24.1655 3.4729L24.1655,22.4136A0.8541,0.8541 0,0 1,23.3114 23.2677L3.6116,23.2677A0.8541,0.8541 0,0 1,2.7575 22.4136L2.7575,3.4729A0.8541,0.8541 0,0 1,3.6116 2.6188z"
android:strokeWidth="0.99516809"
android:fillColor="#6cb8f7"
android:fillAlpha="1"/>
<path
android:pathData="M3.6108,3.3934L23.3107,3.3934A0.8541,0.8541 0,0 1,24.1648 4.2475L24.1648,23.1882A0.8541,0.8541 0,0 1,23.3107 24.0423L3.6108,24.0423A0.8541,0.8541 0,0 1,2.7567 23.1882L2.7567,4.2475A0.8541,0.8541 0,0 1,3.6108 3.3934z"
android:strokeWidth="0.99516809"
android:fillColor="#0c84e3"
android:fillAlpha="1"/>
<path
android:pathData="M3.6099,3.0237L23.3097,3.0237A0.8541,0.8541 0,0 1,24.1638 3.8777L24.1638,22.8185A0.8541,0.8541 0,0 1,23.3097 23.6725L3.6099,23.6725A0.8541,0.8541 0,0 1,2.7558 22.8185L2.7558,3.8777A0.8541,0.8541 0,0 1,3.6099 3.0237z"
android:strokeWidth="0.99516809"
android:fillColor="#2196f3"
android:fillAlpha="1"/>
<path
android:pathData="M6.5687,11.4794L20.4473,11.4794A0.6025,0.5534 0,0 1,21.0497 12.0329L21.0497,14.3731A0.6025,0.5534 0,0 1,20.4473 14.9266L6.5687,14.9266A0.6025,0.5534 0,0 1,5.9662 14.3731L5.9662,12.0329A0.6025,0.5534 0,0 1,6.5687 11.4794z"
android:strokeWidth="0.95660609"
android:fillColor="#ffffff"
android:fillAlpha="1"/>
<path
android:pathData="M7.8393,10.0652L19.276,10.0652A0.5914,0.5534 0,0 1,19.8674 10.6186L19.8674,16.1409A0.5914,0.5534 0,0 1,19.276 16.6943L7.8393,16.6943A0.5914,0.5534 0,0 1,7.2478 16.1409L7.2478,10.6186A0.5914,0.5534 0,0 1,7.8393 10.0652z"
android:strokeWidth="0.98218656"
android:fillColor="#2196f3"
android:fillAlpha="1"/>
<path
android:pathData="M8.5725,11.17L18.66,11.17A0.6131,0.5534 0,0 1,19.2731 11.7235L19.2731,14.7709A0.6131,0.5534 0,0 1,18.66 15.3243L8.5725,15.3243A0.6131,0.5534 0,0 1,7.9594 14.7709L7.9594,11.7235A0.6131,0.5534 0,0 1,8.5725 11.17z"
android:fillColor="#ffffff"
android:fillAlpha="1"/>
<path
android:pathData="M16.788,13.2494a0.7384,0.7513 0,1 0,1.4767 0a0.7384,0.7513 0,1 0,-1.4767 0z"
android:fillColor="#2196f3"
android:fillAlpha="1"/>
</vector>

View File

@ -0,0 +1,39 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="26.947369dp"
android:height="26.947369dp"
android:viewportWidth="26.947369"
android:viewportHeight="26.947369">
<path
android:pathData="M4.0362,2.923L23.736,2.923A0.8541,0.8541 0,0 1,24.5901 3.7771L24.5901,22.7178A0.8541,0.8541 0,0 1,23.736 23.5719L4.0362,23.5719A0.8541,0.8541 0,0 1,3.1821 22.7178L3.1821,3.7771A0.8541,0.8541 0,0 1,4.0362 2.923z"
android:strokeWidth="0.99516809"
android:fillColor="#a1a1a1"
android:fillAlpha="1"/>
<path
android:pathData="M4.0354,3.6976L23.7353,3.6976A0.8541,0.8541 0,0 1,24.5894 4.5517L24.5894,23.4924A0.8541,0.8541 0,0 1,23.7353 24.3465L4.0354,24.3465A0.8541,0.8541 0,0 1,3.1813 23.4924L3.1813,4.5517A0.8541,0.8541 0,0 1,4.0354 3.6976z"
android:strokeWidth="0.99516809"
android:fillColor="#7d7d7d"
android:fillAlpha="1"/>
<path
android:pathData="M4.0344,3.3278L23.7343,3.3278A0.8541,0.8541 0,0 1,24.5884 4.1819L24.5884,23.1226A0.8541,0.8541 0,0 1,23.7343 23.9767L4.0344,23.9767A0.8541,0.8541 0,0 1,3.1804 23.1226L3.1804,4.1819A0.8541,0.8541 0,0 1,4.0344 3.3278z"
android:strokeWidth="0.99516809"
android:fillColor="#8a8a8a"
android:fillAlpha="1"/>
<path
android:pathData="M7.3028,11.9896L21.2647,11.9896A0.6061,0.5534 0,0 1,21.8708 12.5431L21.8708,14.8833A0.6061,0.5534 0,0 1,21.2647 15.4368L7.3028,15.4368A0.6061,0.5534 0,0 1,6.6967 14.8833L6.6967,12.5431A0.6061,0.5534 0,0 1,7.3028 11.9896z"
android:strokeWidth="0.95947295"
android:fillColor="#ffffff"
android:fillAlpha="1"/>
<path
android:pathData="M8.6603,10.5754L20.0971,10.5754A0.5914,0.5534 0,0 1,20.6885 11.1289L20.6885,16.6511A0.5914,0.5534 0,0 1,20.0971 17.2045L8.6603,17.2045A0.5914,0.5534 0,0 1,8.0689 16.6511L8.0689,11.1289A0.5914,0.5534 0,0 1,8.6603 10.5754z"
android:strokeWidth="0.98218656"
android:fillColor="#8a8a8a"
android:fillAlpha="1"/>
<path
android:pathData="M9.3935,11.6803L19.4811,11.6803A0.6131,0.5534 0,0 1,20.0942 12.2337L20.0942,15.2811A0.6131,0.5534 0,0 1,19.4811 15.8345L9.3935,15.8345A0.6131,0.5534 0,0 1,8.7805 15.2811L8.7805,12.2337A0.6131,0.5534 0,0 1,9.3935 11.6803z"
android:fillColor="#ffffff"
android:fillAlpha="1"/>
<path
android:pathData="M17.609,13.7596a0.7384,0.7513 0,1 0,1.4767 0a0.7384,0.7513 0,1 0,-1.4767 0z"
android:fillColor="#8a8a8a"
android:fillAlpha="1"/>
</vector>

View File

@ -0,0 +1,53 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="26.947369dp"
android:height="26.947369dp"
android:viewportWidth="26.947369"
android:viewportHeight="26.947369">
<path
android:pathData="M3.6116,2.6188L23.3114,2.6188A0.8541,0.8541 0,0 1,24.1655 3.4729L24.1655,22.4136A0.8541,0.8541 0,0 1,23.3114 23.2677L3.6116,23.2677A0.8541,0.8541 0,0 1,2.7575 22.4136L2.7575,3.4729A0.8541,0.8541 0,0 1,3.6116 2.6188z"
android:strokeWidth="0.99516809"
android:fillColor="#6cb8f7"
android:fillAlpha="1"/>
<path
android:pathData="M3.6108,3.3934L23.3107,3.3934A0.8541,0.8541 0,0 1,24.1648 4.2475L24.1648,23.1882A0.8541,0.8541 0,0 1,23.3107 24.0423L3.6108,24.0423A0.8541,0.8541 0,0 1,2.7567 23.1882L2.7567,4.2475A0.8541,0.8541 0,0 1,3.6108 3.3934z"
android:strokeWidth="0.99516809"
android:fillColor="#0c84e3"
android:fillAlpha="1"/>
<path
android:pathData="M3.6099,3.0237L23.3097,3.0237A0.8541,0.8541 0,0 1,24.1638 3.8777L24.1638,22.8185A0.8541,0.8541 0,0 1,23.3097 23.6725L3.6099,23.6725A0.8541,0.8541 0,0 1,2.7558 22.8185L2.7558,3.8777A0.8541,0.8541 0,0 1,3.6099 3.0237z"
android:strokeWidth="0.99516809"
android:fillColor="#2196f3"
android:fillAlpha="1"/>
<path
android:pathData="m13.514,11.5177c0.7268,-0.0047 2.7305,-0.0312 3.0899,-0.6586 0.3594,-0.6274 -0.6417,-2.3511 -1.0091,-2.9738 -0.3674,-0.6227 -1.392,-2.3327 -2.1188,-2.328 -0.7268,0.0047 -1.7296,1.7278 -2.089,2.3552C11.0276,8.5399 10.0486,10.2764 10.416,10.8991 10.7834,11.5219 12.7872,11.5224 13.514,11.5177Z"
android:strokeWidth="0.75212771"
android:fillColor="#ffffff"
android:fillAlpha="1"/>
<path
android:pathData="m8.4011,13.429c0.8788,-0.0249 1.4878,1.1911 1.9465,2.0268 0.4587,0.8358 1.1528,1.9937 0.7328,2.8544 -0.42,0.8607 -1.6694,0.8404 -2.5482,0.8653 -0.8788,0.0249 -2.1256,0.1158 -2.5843,-0.7199 -0.4587,-0.8358 0.1816,-2.0315 0.6017,-2.8922 0.42,-0.8607 0.9728,-2.1095 1.8516,-2.1344z"
android:strokeWidth="0.64926457"
android:fillColor="#ffffff"
android:fillAlpha="1"/>
<path
android:pathData="M13.4853,6.9897C13.223,6.9908 12.9187,7.0032 12.7868,6.8613 12.655,6.7194 12.8216,6.5589 12.952,6.4158 13.0825,6.2728 13.2185,6.1013 13.4808,6.1002 13.743,6.0991 13.8808,6.2693 14.0127,6.4112 14.1445,6.5532 14.3128,6.7122 14.1824,6.8553 14.052,6.9983 13.7476,6.9886 13.4853,6.9897Z"
android:fillColor="#2196f3"
android:fillAlpha="1"/>
<path
android:pathData="M8.4311,14.7718C8.1939,14.7729 7.8517,14.7465 7.7325,14.6182 7.6132,14.4899 7.7448,14.2896 7.8627,14.1602 7.9807,14.0309 8.1892,13.8581 8.4264,13.857 8.6636,13.856 8.8739,14.027 8.9931,14.1553 9.1124,14.2836 9.246,14.4828 9.128,14.6121 9.0101,14.7415 8.6682,14.7708 8.4311,14.7718Z"
android:fillColor="#2196f3"
android:fillAlpha="1"/>
<path
android:pathData="M5.7787,18.0041a2.7403,2.7842 0,1 0,5.4805 0a2.7403,2.7842 0,1 0,-5.4805 0z"
android:strokeWidth="1.24393165"
android:fillColor="#fefefe"
android:fillAlpha="1"/>
<path
android:pathData="M16.2024,14.348L20.1069,14.348A0.8541,0.8541 0,0 1,20.961 15.2021L20.961,19.1065A0.8541,0.8541 0,0 1,20.1069 19.9606L16.2024,19.9606A0.8541,0.8541 0,0 1,15.3483 19.1065L15.3483,15.2021A0.8541,0.8541 0,0 1,16.2024 14.348z"
android:fillColor="#ffffff"
android:fillAlpha="1"/>
<path
android:pathData="M15.8657,15.3747a0.5535,0.5359 0,1 0,1.107 0a0.5535,0.5359 0,1 0,-1.107 0z"
android:strokeWidth="1.06593406"
android:fillColor="#2196f3"
android:fillAlpha="1"/>
</vector>

View File

@ -0,0 +1,53 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="26.947369dp"
android:height="26.947369dp"
android:viewportWidth="26.947369"
android:viewportHeight="26.947369">
<path
android:pathData="M4.0362,2.923L23.736,2.923A0.8541,0.8541 0,0 1,24.5901 3.7771L24.5901,22.7178A0.8541,0.8541 0,0 1,23.736 23.5719L4.0362,23.5719A0.8541,0.8541 0,0 1,3.1821 22.7178L3.1821,3.7771A0.8541,0.8541 0,0 1,4.0362 2.923z"
android:strokeWidth="0.99516809"
android:fillColor="#a1a1a1"
android:fillAlpha="1"/>
<path
android:pathData="M4.0354,3.6976L23.7353,3.6976A0.8541,0.8541 0,0 1,24.5894 4.5517L24.5894,23.4924A0.8541,0.8541 0,0 1,23.7353 24.3465L4.0354,24.3465A0.8541,0.8541 0,0 1,3.1813 23.4924L3.1813,4.5517A0.8541,0.8541 0,0 1,4.0354 3.6976z"
android:strokeWidth="0.99516809"
android:fillColor="#7d7d7d"
android:fillAlpha="1"/>
<path
android:pathData="M4.0344,3.3278L23.7343,3.3278A0.8541,0.8541 0,0 1,24.5884 4.1819L24.5884,23.1226A0.8541,0.8541 0,0 1,23.7343 23.9767L4.0344,23.9767A0.8541,0.8541 0,0 1,3.1804 23.1226L3.1804,4.1819A0.8541,0.8541 0,0 1,4.0344 3.3278z"
android:strokeWidth="0.99516809"
android:fillColor="#8a8a8a"
android:fillAlpha="1"/>
<path
android:pathData="m13.9386,11.8219c0.7268,-0.0047 2.7305,-0.0312 3.0899,-0.6586 0.3594,-0.6274 -0.6417,-2.3511 -1.0091,-2.9738 -0.3674,-0.6227 -1.392,-2.3327 -2.1188,-2.328 -0.7268,0.0047 -1.7296,1.7278 -2.089,2.3552C11.4522,8.8441 10.4731,10.5805 10.8405,11.2033 11.2079,11.826 13.2118,11.8266 13.9386,11.8219Z"
android:strokeWidth="0.75212771"
android:fillColor="#ffffff"
android:fillAlpha="1"/>
<path
android:pathData="m8.8257,13.7332c0.8788,-0.0249 1.4878,1.1911 1.9465,2.0268 0.4587,0.8358 1.1528,1.9937 0.7328,2.8544 -0.42,0.8607 -1.6694,0.8404 -2.5482,0.8653 -0.8788,0.0249 -2.1256,0.1158 -2.5843,-0.7199 -0.4587,-0.8358 0.1816,-2.0315 0.6017,-2.8922 0.42,-0.8607 0.9728,-2.1095 1.8516,-2.1344z"
android:strokeWidth="0.64926457"
android:fillColor="#ffffff"
android:fillAlpha="1"/>
<path
android:pathData="M13.9099,7.2939C13.6476,7.295 13.3433,7.3074 13.2114,7.1655 13.0795,7.0236 13.2462,6.8631 13.3766,6.72 13.507,6.577 13.6431,6.4055 13.9053,6.4044 14.1676,6.4032 14.3054,6.5735 14.4372,6.7154 14.5691,6.8573 14.7374,7.0164 14.607,7.1594 14.4766,7.3025 14.1721,7.2927 13.9099,7.2939Z"
android:fillColor="#8a8a8a"
android:fillAlpha="1"/>
<path
android:pathData="M8.8556,15.076C8.6185,15.077 8.2763,15.0507 8.157,14.9223 8.0378,14.794 8.1694,14.5937 8.2873,14.4644 8.4052,14.335 8.6138,14.1622 8.851,14.1612 9.0881,14.1602 9.2985,14.3312 9.4177,14.4595 9.537,14.5878 9.6705,14.787 9.5526,14.9163 9.4347,15.0456 9.0928,15.075 8.8556,15.076Z"
android:fillColor="#8a8a8a"
android:fillAlpha="1"/>
<path
android:pathData="M6.2033,18.3082a2.7403,2.7842 0,1 0,5.4805 0a2.7403,2.7842 0,1 0,-5.4805 0z"
android:strokeWidth="1.24393165"
android:fillColor="#fefefe"
android:fillAlpha="1"/>
<path
android:pathData="M16.627,14.6521L20.5315,14.6521A0.8541,0.8541 0,0 1,21.3856 15.5062L21.3856,19.4107A0.8541,0.8541 0,0 1,20.5315 20.2648L16.627,20.2648A0.8541,0.8541 0,0 1,15.7729 19.4107L15.7729,15.5062A0.8541,0.8541 0,0 1,16.627 14.6521z"
android:fillColor="#ffffff"
android:fillAlpha="1"/>
<path
android:pathData="M16.2903,15.6788a0.5535,0.5359 0,1 0,1.107 0a0.5535,0.5359 0,1 0,-1.107 0z"
android:strokeWidth="1.06593406"
android:fillColor="#8a8a8a"
android:fillAlpha="1"/>
</vector>

View File

@ -0,0 +1,50 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="26.947369dp"
android:height="26.947369dp"
android:viewportWidth="26.947369"
android:viewportHeight="26.947369">
<path
android:pathData="M3.6116,2.6188L23.3114,2.6188A0.8541,0.8541 0,0 1,24.1655 3.4729L24.1655,22.4136A0.8541,0.8541 0,0 1,23.3114 23.2677L3.6116,23.2677A0.8541,0.8541 0,0 1,2.7575 22.4136L2.7575,3.4729A0.8541,0.8541 0,0 1,3.6116 2.6188z"
android:strokeWidth="0.99516809"
android:fillColor="#6cb8f7"
android:fillAlpha="1"/>
<path
android:pathData="M3.6108,3.3934L23.3107,3.3934A0.8541,0.8541 0,0 1,24.1648 4.2475L24.1648,23.1882A0.8541,0.8541 0,0 1,23.3107 24.0423L3.6108,24.0423A0.8541,0.8541 0,0 1,2.7567 23.1882L2.7567,4.2475A0.8541,0.8541 0,0 1,3.6108 3.3934z"
android:strokeWidth="0.99516809"
android:fillColor="#0c84e3"
android:fillAlpha="1"/>
<path
android:pathData="M3.6099,3.0237L23.3097,3.0237A0.8541,0.8541 0,0 1,24.1638 3.8777L24.1638,22.8185A0.8541,0.8541 0,0 1,23.3097 23.6725L3.6099,23.6725A0.8541,0.8541 0,0 1,2.7558 22.8185L2.7558,3.8777A0.8541,0.8541 0,0 1,3.6099 3.0237z"
android:strokeWidth="0.99516809"
android:fillColor="#2196f3"
android:fillAlpha="1"/>
<path
android:pathData="M8.9063,7.8224L18,7.8224A0.6875,0.6875 0,0 1,18.6875 8.5099L18.6875,18.2599A0.6875,0.6875 0,0 1,18 18.9474L8.9063,18.9474A0.6875,0.6875 0,0 1,8.2188 18.2599L8.2188,8.5099A0.6875,0.6875 0,0 1,8.9063 7.8224z"
android:fillColor="#ffffff"
android:fillAlpha="1"/>
<path
android:pathData="m10.8958,10.3231a3.6594,3.2653 92.1269,0 1,2.6306 -1.4692,3.6594 3.2653,92.1269 0,1 2.6058,1.4747l-2.6366,2.1842z"
android:strokeWidth="0.93131608"
android:fillColor="#2196f3"
android:fillAlpha="1"/>
<path
android:pathData="m11.6876,11.4717a2.9816,2.2646 90.8712,0 1,1.8242 -1.1972,2.9816 2.2646,90.8712 0,1 1.8071,1.2017l-1.8284,1.7798z"
android:strokeWidth="0.70008069"
android:fillColor="#ffffff"
android:fillAlpha="1"/>
<path
android:pathData="M12.2903,9.7905L12.5444,10.1551A0.0895,0.0891 100.0071,0 1,12.5224 10.2797L12.5224,10.2797A0.0895,0.0891 100.0071,0 1,12.3983 10.2578L12.1442,9.8932A0.0895,0.0891 100.0071,0 1,12.1662 9.7686L12.1662,9.7686A0.0895,0.0891 100.0071,0 1,12.2903 9.7905z"
android:strokeWidth="0.8715741"
android:fillColor="#ffffff"
android:fillAlpha="1"/>
<path
android:pathData="M16.1099,10.4527L15.2596,11.1627A0.0983,0.108 92.4563,0 1,15.107 11.1561L15.107,11.1561A0.0983,0.108 92.4563,0 1,15.113 11.0172L15.9633,10.3072A0.0983,0.108 92.4563,0 1,16.1159 10.3137L16.1159,10.3137A0.0983,0.108 92.4563,0 1,16.1099 10.4527z"
android:strokeWidth="0.43048036"
android:fillColor="#2196f3"
android:fillAlpha="1"/>
<path
android:pathData="M11.0279,10.3108L11.8859,11.0024A0.1073,0.0972 81.0396,0 1,11.9095 11.1523L11.9095,11.1523A0.1073,0.0972 81.0396,0 1,11.7737 11.1737L10.9158,10.4821A0.1073,0.0972 81.0396,0 1,10.8921 10.3322L10.8921,10.3322A0.1073,0.0972 81.0396,0 1,11.0279 10.3108z"
android:strokeWidth="0.42741153"
android:fillColor="#2196f3"
android:fillAlpha="1"/>
</vector>

View File

@ -0,0 +1,50 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="26.947369dp"
android:height="26.947369dp"
android:viewportWidth="26.947369"
android:viewportHeight="26.947369">
<path
android:pathData="M4.0344,3.3278L23.7343,3.3278A0.8541,0.8541 0,0 1,24.5884 4.1819L24.5884,23.1226A0.8541,0.8541 0,0 1,23.7343 23.9767L4.0344,23.9767A0.8541,0.8541 0,0 1,3.1804 23.1226L3.1804,4.1819A0.8541,0.8541 0,0 1,4.0344 3.3278z"
android:strokeWidth="0.99516809"
android:fillColor="#8a8a8a"
android:fillAlpha="1"/>
<path
android:pathData="M4.0354,3.6976L23.7353,3.6976A0.8541,0.8541 0,0 1,24.5894 4.5517L24.5894,23.4924A0.8541,0.8541 0,0 1,23.7353 24.3465L4.0354,24.3465A0.8541,0.8541 0,0 1,3.1813 23.4924L3.1813,4.5517A0.8541,0.8541 0,0 1,4.0354 3.6976z"
android:strokeWidth="0.99516809"
android:fillColor="#7d7d7d"
android:fillAlpha="1"/>
<path
android:pathData="M4.0362,2.923L23.736,2.923A0.8541,0.8541 0,0 1,24.5901 3.7771L24.5901,22.7178A0.8541,0.8541 0,0 1,23.736 23.5719L4.0362,23.5719A0.8541,0.8541 0,0 1,3.1821 22.7178L3.1821,3.7771A0.8541,0.8541 0,0 1,4.0362 2.923z"
android:strokeWidth="0.99516809"
android:fillColor="#a1a1a1"
android:fillAlpha="1"/>
<path
android:pathData="M9.1836,7.5521L18.2774,7.5521A0.6875,0.6875 0,0 1,18.9649 8.2396L18.9649,17.9896A0.6875,0.6875 0,0 1,18.2774 18.6771L9.1836,18.6771A0.6875,0.6875 0,0 1,8.4961 17.9896L8.4961,8.2396A0.6875,0.6875 0,0 1,9.1836 7.5521z"
android:fillColor="#ffffff"
android:fillAlpha="1"/>
<path
android:pathData="m11.1732,10.0528a3.6594,3.2653 92.1269,0 1,2.6306 -1.4692,3.6594 3.2653,92.1269 0,1 2.6058,1.4747l-2.6366,2.1842z"
android:strokeWidth="0.93131608"
android:fillColor="#a1a1a1"
android:fillAlpha="1"/>
<path
android:pathData="m11.965,11.2014a2.9816,2.2646 90.8712,0 1,1.8242 -1.1972,2.9816 2.2646,90.8712 0,1 1.8071,1.2017l-1.8284,1.7798z"
android:strokeWidth="0.70008069"
android:fillColor="#ffffff"
android:fillAlpha="1"/>
<path
android:pathData="M12.5677,9.5202L12.8218,9.8848A0.0895,0.0891 100.0071,0 1,12.7998 10.0094L12.7998,10.0094A0.0895,0.0891 100.0071,0 1,12.6757 9.9875L12.4216,9.623A0.0895,0.0891 100.0071,0 1,12.4436 9.4983L12.4436,9.4983A0.0895,0.0891 100.0071,0 1,12.5677 9.5202z"
android:strokeWidth="0.8715741"
android:fillColor="#ffffff"
android:fillAlpha="1"/>
<path
android:pathData="M16.3873,10.1824L15.537,10.8924A0.0983,0.108 92.4563,0 1,15.3844 10.8859L15.3844,10.8859A0.0983,0.108 92.4563,0 1,15.3904 10.7469L16.2407,10.0369A0.0983,0.108 92.4563,0 1,16.3933 10.0435L16.3933,10.0435A0.0983,0.108 92.4563,0 1,16.3873 10.1824z"
android:strokeWidth="0.43048036"
android:fillColor="#a1a1a1"
android:fillAlpha="1"/>
<path
android:pathData="M11.3053,10.0405L12.1633,10.7321A0.1073,0.0972 81.0396,0 1,12.1869 10.882L12.1869,10.882A0.1073,0.0972 81.0396,0 1,12.0511 10.9034L11.1932,10.2118A0.1073,0.0972 81.0396,0 1,11.1695 10.0619L11.1695,10.0619A0.1073,0.0972 81.0396,0 1,11.3053 10.0405z"
android:strokeWidth="0.42741153"
android:fillColor="#a1a1a1"
android:fillAlpha="1"/>
</vector>

View File

@ -410,9 +410,9 @@
<string name="mi2_prefs_button_actions">Akce tlačítka</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_count_summary">Počet stisknutí tlačítka pro vyvolání Události 1. Další stejné množství stisků vyvolá Událost 2 atd.</string>
<string name="mi2_prefs_button_press_broadcast">Vysílání zpráv</string>
<string name="mi2_prefs_button_press_broadcast_summary">Vysílání zprávy po definovaném počtu stisknutí tlačítka</string>
<string name="mi2_prefs_button_press_broadcast_summary">Vysílání broadcast zprávy po při události. Parametr button_id je doplněn do každé zprávy automaticky.</string>
<string name="mi2_prefs_button_action">Zapnout akci tlačítka</string>
<string name="mi2_prefs_button_action_summary">Zapnout akci na zadaný počet stisknutí tlačítka</string>
<string name="mi2_prefs_button_action_vibrate">Zapnout vibrování náramku</string>
@ -810,4 +810,13 @@
<string name="pref_disable_new_ble_scanning">Zakázat nové BLE skenování</string>
<string name="pref_summary_disable_new_ble_scanning">Tuto možnost zaškrtněte pokud Vaše zařízení nelze najít během vyhledávání</string>
<string name="devicetype_banglejs">Bangle.js</string>
<string name="devicetype_y5">Y5</string>
<string name="prefs_button_single_press_action_selection_title">Akce události 1</string>
<string name="prefs_button_double_press_action_selection_title">Akce události 2</string>
<string name="prefs_button_triple_press_action_selection_title">Akce události 3</string>
<string name="prefs_button_variable_actions">Detailní nastavení stisku tlačítka</string>
<string name="prefs_button_long_press_action_selection_title">Akce pro dlouhý stisk</string>
<string name="alarm_snooze">Později...</string>
<string name="error_no_location_access">Přístup k poloze musí být díky systému Android přístupů povolen a zapnut, aby bylo možno správně naskenovat zařízení</string>
<string name="devicetype_itag">iTag</string>
</resources>

View File

@ -636,7 +636,7 @@
<string name="mode_configuration">Modus-Konfiguration</string>
<string name="save_configuration">Konfiguration speichern</string>
<string name="appwidget_not_connected">Nicht verbunden, Alarm nicht eingestellt.</string>
<string name="prefs_disconnect_notification">Benachichtigung beim Verbindung trennen</string>
<string name="prefs_disconnect_notification">Benachrichtigung beim Verbindung trennen</string>
<string name="activity_prefs_calories_burnt">Tägliches Ziel: verbrannte Kalorien</string>
<string name="activity_prefs_distance_meters">Tägliches Ziel: zurückgelegte Strecke in Meter</string>
<string name="activity_prefs_activetime_minutes">Tägliches Ziel: aktive Zeit in Minuten</string>
@ -825,4 +825,7 @@
<string name="prefs_button_variable_actions">Detaillierte Einstellungen zum Drücken von Tasten</string>
<string name="prefs_button_long_press_action_selection_title">Langer Tastendruck</string>
<string name="alarm_snooze">Schlummern</string>
<string name="error_no_location_access">Der Standortzugriff muss gewährt werden und aktiviert sein, damit das Scannen ordnungsgemäß funktioniert</string>
<string name="devicetype_itag">iTag</string>
<string name="pref_summary_allow_high_mtu">Erhöht die Übertragungsgeschwindigkeit, funktioniert aber möglicherweise nicht auf einigen Android-Geräten.</string>
</resources>

View File

@ -821,4 +821,8 @@
<string name="prefs_button_variable_actions">הגדרות נרחבות ללחיצת כפתור</string>
<string name="prefs_button_long_press_action_selection_title">פעולה ללחיצה ארוכה על הכפתור</string>
<string name="alarm_snooze">נודניק</string>
<string name="error_no_location_access">יש להעניק גישה למיקום כדי שהסריקה תעבוד כראוי</string>
<string name="devicetype_itag">iTag</string>
<string name="pref_title_allow_high_mtu">לאפשר MTU גבוה</string>
<string name="pref_summary_allow_high_mtu">מגביר את קצב ההעברה, יש מכשירי Android שלא תומכים בזה.</string>
</resources>

View File

@ -821,4 +821,9 @@
<string name="prefs_button_triple_press_action_selection_title">Handling for hendelse 3</string>
<string name="prefs_button_variable_actions">Detaljerte knappetrykksinnstillinger</string>
<string name="prefs_button_long_press_action_selection_title">Handling for langt knappetrykk</string>
<string name="alarm_snooze">Slumre</string>
<string name="error_no_location_access">Plasseringstilgang må innvilges og skrus på for at skanning skal fungere</string>
<string name="devicetype_itag">iTag</string>
<string name="pref_title_allow_high_mtu">Tillat høy MTU</string>
<string name="pref_summary_allow_high_mtu">Øker overføringshastighet, men kan forårsake problemer på noen Android-enheter.</string>
</resources>

View File

@ -4,7 +4,7 @@
<string name="title_activity_controlcenter">Gadgetbridge</string>
<string name="action_settings">Ustawienia</string>
<string name="action_debug">Debuguj</string>
<string name="action_quit">Zamknij</string>
<string name="action_quit">Wyjdź</string>
<string name="controlcenter_fetch_activity_data">Synchronizuj</string>
<string name="controlcenter_find_device">Znajdź zagubione urządzenie</string>
<string name="controlcenter_take_screenshot">Zrób zrzut ekranu</string>
@ -349,7 +349,7 @@
<string name="controlcenter_connect">Połącz…</string>
<string name="controlcenter_navigation_drawer_open">Otwórz okno nawigacji</string>
<string name="controlcenter_navigation_drawer_close">Zamknij okno nawigacji</string>
<string name="controlcenter_calibrate_device">Kalibracja urządzenia</string>
<string name="controlcenter_calibrate_device">Skalibruj urządzenie</string>
<string name="blacklist_all_for_notifications">Zablokuj wszystkie powiadomienia</string>
<string name="whitelist_all_for_notifications">Zezwól na wszystkie powiadomienia</string>
<string name="fw_upgrade_notice_amazfitbip">Zamierzasz zainstalować firmware %s na swoim Amazfit Bip.
@ -379,7 +379,7 @@
<string name="pref_title_call_privacy_mode">Tryb prywatności połączeń telefonicznych</string>
<string name="pref_title_weather_location">Lokalizacja pogody (CM/LOS)</string>
<string name="pref_summary_enable_outgoing_call">Wyłączenie tej opcji spowoduje również, że Pebble 2/LE przestanie wibrować przy połączeniach wychodzących</string>
<string name="pref_summary_autoremove_notifications">Powiadomienia są automatycznie usuwane z Pebble po usunięciu ich z urządzenia Android</string>
<string name="pref_summary_autoremove_notifications">Powiadomienia są automatycznie usuwane z Pebble po usunięciu z urządzenia Android</string>
<string name="pref_pebble_privacy_mode_content">Przesuń tekst powiadomienia poza ekran</string>
<string name="pref_summary_location_keep_uptodate">Spróbuj pobrać obecną lokalizację po uruchomieniu, awaryjnie użyj zapisanej lokalizacji</string>
<string name="controlcenter_change_led_color">Zmień kolor diody LED</string>
@ -768,7 +768,7 @@
<string name="toast_app_must_not_be_blacklisted">Nie można skonfigurować aplikacji będącej na czarnej liście</string>
<string name="edittext_notification_filter_words_hint">Wprowadź żądane wyrazy, każdy w nowej linii</string>
<string name="toast_notification_filter_saved_successfully">Zapisano filtr powiadomień</string>
<string name="filter_mode_blacklist">Blokuj, gdy zawiera słowa</string>
<string name="filter_mode_blacklist">Blokuj jeśli zawiera słowa</string>
<string name="filter_mode">Tryb filtrowania</string>
<string name="mode_configuration">Ustawienia trybu</string>
<string name="appwidget_not_connected">Nie połączony, alarm nie ustawiony.</string>
@ -778,7 +778,7 @@
<string name="zetime_signaling_beep_once">Zabrzęcz raz</string>
<string name="zetime_signaling_beep_twice">Zabrzęcz dwa razy</string>
<string name="zetime_signaling_vibrate_beep_once">Wibracja i brzęczenie raz</string>
<string name="pref_title_support_voip_calls">Włącz powiadomienia o połączeniach z aplikacji VoIP</string>
<string name="pref_title_support_voip_calls">Włącz VoIP połączenia</string>
<string name="pref_summary_authkey">Zmień klucz autoryzacji na wspólny dla wszystkich urządzeń z Androidem, z których chcesz się połączyć. Poprzedni domyślny klucz dla wszystkich urządzeń to 0123456789@ABCDE</string>
<string name="prefs_hr_alarm_activity">Alarm tętna podczas aktywności sportowej</string>
<string name="prefs_hr_alarm_low">Dolny limit</string>
@ -817,4 +817,10 @@
<string name="prefs_button_triple_press_action_selection_title">Akcja zdarzenia 3</string>
<string name="prefs_button_variable_actions">Szczegółowe ustawienia naciśnięcia przycisku</string>
<string name="prefs_button_long_press_action_selection_title">Akcja przytrzymania przycisku</string>
<string name="activity_web_view">Przeglądanie aktywności w sieci</string>
<string name="reset_index">Zresetuj datę pobierania</string>
<string name="zetime_activity_tracking_summary">Monitirowanie aktywności, liczy twoje kroki i inne.</string>
<string name="qhybrid_time_shift">przesunięcie czasowe</string>
<string name="qhybrid_use_activity_hand_as_notification_counter">użyj ręki aktywności jako licznika powiadomień</string>
<string name="devicetype_itag">iTag</string>
</resources>

View File

@ -831,4 +831,8 @@
<string name="prefs_button_variable_actions">Configurações detalhado de pressionamento de botão</string>
<string name="prefs_button_long_press_action_selection_title">Ação do botão de pressionamento longo</string>
<string name="alarm_snooze">Adiar</string>
<string name="error_no_location_access">Acesso a localização deve ser concedido e habilitado para varredura funcionar adequadamente</string>
<string name="devicetype_itag">iTag</string>
<string name="pref_title_allow_high_mtu">Permitir MTU alto</string>
<string name="pref_summary_allow_high_mtu">Aumenta velocidade de transferência, mas pode não funcionar em alguns dispositivos Android.</string>
</resources>

View File

@ -29,12 +29,12 @@
<string name="title_activity_appblacklist">Перелік заблокованих сповіщень</string>
<!--Strings related to FwAppInstaller-->
<string name="title_activity_fw_app_insaller">Встановлення мікропрограми</string>
<string name="fw_upgrade_notice">Ви збираєтесь встановити мікропрограму %s на заміну поточній Вашого MiBand.</string>
<string name="fw_upgrade_notice">Ви збираєтесь встановити %s.</string>
<string name="fw_multi_upgrade_notice">Ви збираєтесь встановити прошивки %1$s та %2$s на заміну поточній вашого Mi Band.</string>
<string name="miband_firmware_known">Ця мікропрограма була перевірена на сумісність із Gadgetbridge.</string>
<string name="miband_firmware_unknown_warning">Ця мікропрограма не перевірялася і може бути не сумісною із Gadgetbridge.
\n
\nНе рекомендується встановлювати її на Ваш Mi Band!</string>
\nНе рекомендується встановлювати її!</string>
<string name="miband_firmware_suggest_whitelist">Якщо ж Ви вирішили продовжити та все працює, будь ласка, повідомте про це розробникам, аби відмітити версію %s мікропрограми сумісною з вашим пристроєм.</string>
<!--Strings related to Settings-->
<string name="title_activity_settings">Параметри</string>
@ -67,7 +67,7 @@
<string name="pref_title_canned_replies">Відповіді</string>
<string name="pref_title_canned_reply_suffix">Загальний суфікс</string>
<string name="pref_header_development">Параметри для розробників</string>
<string name="pref_title_development_miaddr">MAC адреса Mi Band</string>
<string name="pref_title_development_miaddr">Адреса Mi Band</string>
<string name="pref_title_pebble_settings">Параметри Pebble</string>
<string name="pref_header_activitytrackers">Трекер активності</string>
<string name="pref_title_pebble_activitytracker">Бажаний трекер активності</string>
@ -153,7 +153,7 @@
<string name="pref_screen_notification_profile_generic_social">Соціальні мережі</string>
<string name="control_center_find_lost_device">Знайти загублений пристрій</string>
<string name="control_center_cancel_to_stop_vibration">Скасуйте, аби зупинити вібрацію.</string>
<string name="title_activity_charts">Ваша активність</string>
<string name="title_activity_charts">Активність і сон</string>
<string name="title_activity_set_alarm">Завести Будильник</string>
<string name="controlcenter_start_configure_alarms">Завести будильник</string>
<string name="title_activity_alarm_details">Деталі будильнику</string>
@ -181,9 +181,9 @@
<string name="notif_battery_low_percent">%1$s заряду лишилось: %2$s%%</string>
<string name="notif_battery_low_bigtext_last_charge_time">Остання зарядка була: %s \n</string>
<string name="notif_battery_low_bigtext_number_of_charges">Кількість зарядок: %s</string>
<string name="sleepchart_your_sleep">Ваш сон</string>
<string name="sleepchart_your_sleep">Сон</string>
<string name="weekstepschart_steps_a_week">Кроків за тиждень</string>
<string name="activity_sleepchart_activity_and_sleep">Ваша активність та сон</string>
<string name="activity_sleepchart_activity_and_sleep">Активність</string>
<string name="updating_firmware">Завантаження мікропрограми…</string>
<string name="fwapp_install_device_not_ready">Не можливо встановити файл, пристрій не готовий.</string>
<string name="installhandler_firmware_name">%1$s: %2$s %3$s</string>
@ -213,7 +213,7 @@
<string name="abstract_chart_fragment_kind_activity">Активність</string>
<string name="abstract_chart_fragment_kind_light_sleep">Швидкий сон</string>
<string name="abstract_chart_fragment_kind_deep_sleep">Глибокий сон</string>
<string name="abstract_chart_fragment_kind_not_worn"/>
<string name="abstract_chart_fragment_kind_not_worn">Не носили</string>
<string name="device_not_connected">Не з\'єднано.</string>
<string name="user_feedback_all_alarms_disabled">Всі будильники вимкнено</string>
<string name="pref_title_keep_data_on_device">Лишати дані на пристрої</string>
@ -242,9 +242,9 @@
<string name="controlcenter_navigation_drawer_open">Відкрити навігаційну панель</string>
<string name="controlcenter_navigation_drawer_close">Закрити навігаційну панель</string>
<string name="controlcenter_snackbar_disconnecting">Роз\'єднання</string>
<string name="controlcenter_snackbar_need_longpress">Довго натисніть на картку, щоб Роз\'єднати</string>
<string name="controlcenter_snackbar_need_longpress">Нажміть і тримайте для роз\'єднання</string>
<string name="controlcenter_snackbar_requested_screenshot">Знімок екрана пристрою</string>
<string name="appmanager_cached_watchapps_watchfaces">Додатки в кеші</string>
<string name="appmanager_cached_watchapps_watchfaces">Додатки в пам\'яті</string>
<string name="appmanager_installed_watchfaces">Встановлені годинники</string>
<string name="appmanager_weather_activate">Активувати системний додаток погоди</string>
<string name="appmanager_weather_deactivate">Вимкнути системний додаток погоди</string>
@ -360,7 +360,7 @@
<string name="stats_x_axis_label">Всього хвилин</string>
<string name="weeksleepchart_sleep_a_week">Сон за тиждень</string>
<string name="weeksleepchart_today_sleep_description">Сон сьогодні, ціль: %1$s</string>
<string name="controlcenter_change_led_color">Змінити колір світлодіода</string>
<string name="controlcenter_change_led_color">Змінити колір LED</string>
<string name="controlcenter_change_fm_frequency">Змінити частоту FM</string>
<string name="debugactivity_really_factoryreset_title">Дійсно скинути до заводських налаштувань\?</string>
<string name="pref_title_rtl">З права на ліво</string>
@ -466,4 +466,156 @@
<string name="zetime_date_format_2">ДД/ММ/РР</string>
<string name="zetime_date_format_3">ММ/ДД/РР</string>
<string name="mi2_prefs_button_press_broadcast_default_value" translatable="false">nodomain.freeyourgadget.gadgetbridge.ButtonPressed</string>
<string name="pref_summary_pebble_forcele">Ужити експериментальну підтримку Pebble LE для всіх Pebbles замість BT classic. Потребує парування спочатку з не-LE, а потім з Pebble LE</string>
<string name="pref_title_pebble_mtu_limit">Обмеження GATT MTU для Pebble 2/LE</string>
<string name="pref_summary_pebble_mtu_limit">Якщо ваш Pebble 2/LE не працює, спробуйте це налаштування щоб обмежити MTU (в діапазоні 20-512)</string>
<string name="pref_summary_pebble_enable_applogs">Логи аплікації годинника будуть записані Gadgetbridge (потребує перепідключення)</string>
<string name="pref_title_pebble_always_ack_pebblekit">Передчасний ACK PebbleKit</string>
<string name="pref_summary_pebble_always_ack_pebblekit">Повідомлення які надіслано стороннім зовнішнім аплікаціям буде завжди і одразу підтвердженно</string>
<string name="tap_connected_device_for_app_mananger">Торкніться під\'єднаного пристрою для виклику Менеджера аплікації</string>
<string name="tap_connected_device_for_activity">Торкніться під\'єднаного пристрою для виклику Діяльності</string>
<string name="pairing_creating_bond_with">Зв\'язуюсь з %1$s (%2$s)</string>
<string name="pairing_already_bonded">Вже пов\'язаний з %1$s (%2$s), під\'єднуюсь…</string>
<string name="pref_write_logfiles">Зберігати файли логів</string>
<string name="stats_title">Зони швидкості</string>
<string name="miband_prefs_device_time_offset_hours">Зміщення часу в годинах (для тих, хто працює по ночах)</string>
<string name="mi2_prefs_goal_notification">Повідомлення по мету</string>
<string name="mi2_prefs_display_items">Відображати</string>
<string name="mi2_prefs_activate_display_on_lift">Увімкнути екран при піднесенні</string>
<string name="mi2_prefs_do_not_disturb">Не турбувати</string>
<string name="mi2_prefs_inactivity_warnings">Попередження про неактивність</string>
<string name="mi2_prefs_inactivity_warnings_threshold">Поріг неактивності (хв)</string>
<string name="mi2_prefs_do_not_disturb_start">Початок</string>
<string name="mi2_prefs_do_not_disturb_end">Завершення</string>
<string name="authenticating">Авторизація</string>
<string name="authentication_required">Потрібна авторизація</string>
<string name="activity_prefs_sleep_duration">Бажана довжина сну в годинах</string>
<string name="updatefirmwareoperation_update_in_progress">Записування прошивки</string>
<string name="updatefirmwareoperation_firmware_not_sent">Прошивку не відправлено</string>
<string name="charts_legend_heartrate">Пульс</string>
<string name="live_activity_heart_rate">Пульс</string>
<string name="action_db_management">Керування базою даних</string>
<string name="title_activity_db_management">Керування базою даних</string>
<string name="activity_db_management_merge_old_title">Видалення застарілою бази даних</string>
<string name="dbmanagementactivity_exported_to">Експортовано до: %1$s</string>
<string name="dbmanagementactivity_error_exporting_db">Помилка експорту бази: %1$s</string>
<string name="dbmanagementactivity_error_exporting_shared">Помилка експорту налаштувань: %1$s</string>
<string name="mi2_prefs_button_actions">Дія кнопки</string>
<string name="mi2_prefs_button_actions_summary">Виберіть дію при натисненні</string>
<string name="mi2_prefs_button_press_count">Натиснень на кнопку</string>
<string name="mi2_prefs_button_press_broadcast">Повідомлення для поширення</string>
<string name="mi2_prefs_button_action">Увімкнути кнопку дії</string>
<string name="mi2_prefs_button_action_vibrate">Увімкнути вібрацію паску</string>
<string name="pref_summary_pebble_enable_bgjs">Коли увімкнено, дозволяє циферблату показувати погоду, заряд батареї і т.п.</string>
<string name="automatic">Автоматично</string>
<string name="simplified_chinese">Спрощена китайська</string>
<string name="traditional_chinese">Традиційна китайська</string>
<string name="english">Англійська</string>
<string name="prefs_title_heartrate_measurement_interval">Цілодобове вимірювання пульсу</string>
<string name="pref_header_auto_export">Автоматичний експорт</string>
<string name="pref_title_auto_export_location">Розташування експорту</string>
<string name="pref_title_auto_export_interval">Інтервал експорту</string>
<string name="pref_summary_auto_export_interval">Експорт кожні %d годин(и)</string>
<string name="spanish">Іспанська</string>
<string name="pref_title_pebble_gatt_clientonly">Тільки клієнт GATT</string>
<string name="pref_summary_pebble_gatt_clientonly">Це експериментальне налаштування виключно для Pebble 2, застосуйте якщо є проблеми з підключенням</string>
<string name="pref_auto_fetch">Авто-завантаження даних про активність</string>
<string name="pref_auto_fetch_limit_fetches">Мінімальний час між щавантаженням</string>
<string name="pref_auto_fetch_limit_fetches_summary">Отримати кожні %d хвилин(и)</string>
<string name="russian">Російська</string>
<string name="german">Німецька</string>
<string name="italian">Італійська</string>
<string name="french">Французька</string>
<string name="polish">Польська</string>
<string name="korean">Корейська</string>
<string name="japanese">Японська</string>
<string name="you_slept">Ви спали з %1$s до %2$s</string>
<string name="norwegian_bokmal">Норвезький літературний</string>
<string name="mi3_prefs_night_mode">Нічний режим</string>
<string name="activity_prefs_charts">Налаштування графіків</string>
<string name="activity_prefs_chart_max_heart_rate">Максимальний пульс</string>
<string name="activity_prefs_chart_min_heart_rate">Мінімальний пульс</string>
<string name="notif_battery_low">%1$s низький заряд</string>
<string name="notif_battery_low_extended">%1$s низький заряд: %2$s</string>
<string name="pref_summary_rtl">Увімкніть, якщо ваш пристрій не відображає мови \"зправа наліво\"</string>
<string name="pref_rtl_max_line_length">Максимальна довжина строки \"зправа наліво\"</string>
<string name="pref_rtl_max_line_length_summary">Подовжує чи скорочує строки на які розбитий текст \"зправа наліво\"</string>
<string name="lack_of_sleep">Недосипання: %1$s</string>
<string name="overslept">Пересип: %1$s</string>
<string name="lack_of_step">Недостатньо кроків: %1$d</string>
<string name="live_activity_max_heart_rate">Поточний / максимальний пульс: %1$d / %2$d</string>
<string name="debugactivity_really_factoryreset">Скидання до заводських налаштувань призведе до видалення всіх даних з під\'єднаного пристрою (якщо підтримується). Xiaomi/Huami пристрої також змінять свою Bluetooth MAC адресу, тому вони з\'являться як нові пристрої для Gadgetbridge.</string>
<string name="prefs_disconnect_notification">Повідомлення про від\'єднання</string>
<string name="zetime_title_heart_rate_alarm">Попередження про пульс</string>
<string name="zetime_title_heart_rate_alarm_summary">Годинник повідомить вас, коли перевищено показник пульсу.</string>
<string name="zetime_heart_rate_alarm_enable">Увімкнути попередження про пульс</string>
<string name="zetime_analog_mode_handsandsteps">Руки і кроки</string>
<string name="zetime_activity_tracking">Відслідковування діяльності</string>
<string name="zetime_activity_tracking_summary">Увімкнення відслідковування діяльності, буде рахувати кроки та ін.</string>
<string name="zetime_handmove_display">Рух руки</string>
<string name="zetime_handmove_display_summary">Поверніть зап\'ястя для увімкнення/вимкнення дисплею.</string>
<string name="zetime_calories_type">Тип калорій</string>
<string name="zetime_calories_type_active">Тільки активно спалені калорії</string>
<string name="zetime_calories_type_all">Активно і неактивно спалені калорії</string>
<string name="zetime_prefs_inactivity_repetitions">Повторення</string>
<string name="zetime_prefs_inactivity_mo">Понеділок</string>
<string name="zetime_prefs_inactivity_tu">Вівторек</string>
<string name="zetime_prefs_inactivity_we">Середа</string>
<string name="zetime_prefs_inactivity_th">Четвер</string>
<string name="zetime_prefs_inactivity_fr">П\'ятниця</string>
<string name="zetime_prefs_inactivity_sa">Субота</string>
<string name="zetime_prefs_inactivity_su">Неділя</string>
<string name="zetime_title_alarm_signaling">Вкажіть спосіб повідомлення про будильник</string>
<string name="zetime_signaling_none">Тихо</string>
<string name="zetime_signaling_vibrate">Постійна вібрація</string>
<string name="zetime_signaling_beep">Постійний звук</string>
<string name="zetime_signaling_vibrate_beep">Постійна вібрація і звук</string>
<string name="zetime_signaling_beep_once">Пискнути раз</string>
<string name="zetime_signaling_beep_twice">Пискнути двічі</string>
<string name="pref_screen_notification_profile_missed_call">Повідослення про пропущені дзвінки</string>
<string name="pref_screen_notification_profile_calendar">Повідомлення календарю</string>
<string name="pref_screen_notification_profile_inactivity">Повідомлення про бездіяльність</string>
<string name="pref_screen_notification_profile_low_power">Попередження про низький заряд</string>
<string name="pref_screen_notification_profile_anti_loss">Попередження про втрату</string>
<string name="interval_fifteen_minutes">кожні 15 хв</string>
<string name="interval_forty_five_minutes">кожні 45 хв</string>
<string name="pref_title_support_voip_calls">Увімкніть VoIP дзвінки</string>
<string name="title_activity_device_specific_settings">Налаштування конкретних пристроїв</string>
<string name="pref_title_authkey">Ключ авторизації</string>
<string name="dutch">Дацька</string>
<string name="turkish">Турецька</string>
<string name="ukrainian">Українська</string>
<string name="arabic">Арабська</string>
<string name="indonesian">Індонезійська</string>
<string name="thai">Тайська</string>
<string name="vietnamese">В\'єтнамська</string>
<string name="portuguese">Португальська</string>
<string name="prefs_hr_alarm_activity">Попередження про пульс під час зайнять спортом</string>
<string name="prefs_hr_alarm_low">Нижня границя</string>
<string name="prefs_hr_alarm_high">Верхня границя</string>
<string name="average">В середньому: %1$s</string>
<string name="pref_header_charts">Налаштування графіків</string>
<string name="pref_title_charts_range">Діапазон графікав</string>
<string name="weekstepschart_steps_a_month">Кроків за місяць</string>
<string name="weeksleepchart_sleep_a_month">Сон за місяць</string>
<string name="pref_summary_expose_hr">Дозволяє іншим аплікаціям постійно отримувати дані про пульс, поки Gadgetbridge під\'єднано</string>
<string name="pref_title_expose_hr">Доступ до пульсометру сторонніх аплікацій</string>
<string name="pref_title_use_custom_font">Нестандартний шрифт</string>
<string name="pref_summary_use_custom_font">Увімкніть, якщо ваш пристрій має нестандартну програму для підтримки емоджи</string>
<string name="activity_DB_ExportButton">Експортувати базу даних</string>
<string name="activity_DB_import_button">Імпортувати базу даних</string>
<string name="pref_display_add_device_fab">Кнопка підключення нового пристрою</string>
<string name="pref_display_add_device_fab_on">Завжди видно</string>
<string name="pref_display_add_device_fab_off">Видно якщо не додано пристрій</string>
<string name="preferences_makibes_hr3_settings">Налаштування Makibes HR3</string>
<string name="prefs_find_phone">Знайти телефон</string>
<string name="pref_chart_heartrate_color_red">Червоний</string>
<string name="pref_chart_heartrate_color_orange">Помаранчевий</string>
<string name="pref_title_chart_heartrate_color">Колір пульсу</string>
<string name="pref_title_chart_sleep_rolling_24_hour">Діапазон сну</string>
<string name="pref_chart_sleep_rolling_24_on">Останні 24 години</string>
<string name="pref_chart_sleep_rolling_24_off">Полудень до полудня</string>
<string name="pref_disable_new_ble_scanning">Вимкнути пошук нових BLE</string>
<string name="pref_summary_disable_new_ble_scanning">Увімкніть, якщо ваш пристрій не знайдено під час пошуку</string>
<string name="alarm_snooze">Затримати</string>
</resources>

View File

@ -819,4 +819,8 @@
<string name="prefs_button_variable_actions">按下按钮时的详细设置</string>
<string name="prefs_button_long_press_action_selection_title">长按按钮的动作</string>
<string name="alarm_snooze">打盹</string>
<string name="error_no_location_access">为确保工作正常必须授权地理位置访问和扫描</string>
<string name="devicetype_itag">iTag</string>
<string name="pref_title_allow_high_mtu">允许高 MTU</string>
<string name="pref_summary_allow_high_mtu">增加传输速度,但是在某些 Android 设备上可能不会工作。</string>
</resources>

View File

@ -180,6 +180,8 @@
<string name="pref_title_expose_hr">3rd party realtime HR access</string>
<string name="pref_title_use_custom_font">Use custom font</string>
<string name="pref_summary_use_custom_font">Enable this if your device has a custom font firmware for emoji support</string>
<string name="pref_title_allow_high_mtu">Allow high MTU</string>
<string name="pref_summary_allow_high_mtu">Increases transfer speed, but might not work on some Android devices.</string>
<string name="pref_display_add_device_fab">Connect new device button</string>
<string name="pref_display_add_device_fab_on">Always visible</string>
<string name="pref_display_add_device_fab_off">Visible only if no device is added</string>
@ -686,6 +688,7 @@
<string name="devicetype_y5">Y5</string>
<string name="devicetype_casiogb6900">Casio GB-6900</string>
<string name="devicetype_miscale2">Mi Scale 2</string>
<string name="devicetype_itag">iTag</string>
<string name="devicetype_bfh16">BFH-16</string>
<string name="devicetype_mijia_lywsd02">Mijia Smart Clock</string>
<string name="devicetype_makibes_hr3">Makibes HR3</string>
@ -787,6 +790,8 @@
<string name="prefs_button_variable_actions">Detailed button press settings</string>
<string name="prefs_button_long_press_action_selection_title">Long press button action</string>
<string name="error_no_location_access">Location access must be granted and enabled for scanning to work properly</string>
<plurals name="widget_alarm_target_hours">
<item quantity="one">%d hour</item>
<item quantity="two">%d hours</item>

View File

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