diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/lenovo/watchxplus/WatchXPlusConstants.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/lenovo/watchxplus/WatchXPlusConstants.java index 318bc835a..6d571ddaa 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/lenovo/watchxplus/WatchXPlusConstants.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/lenovo/watchxplus/WatchXPlusConstants.java @@ -52,7 +52,7 @@ public final class WatchXPlusConstants extends LenovoWatchConstants { public static final String PREF_LONGSIT_START = "pref_longsit_start"; public static final String PREF_LONGSIT_END = "pref_longsit_end"; - + public static final String PREF_SHOW_RAW_GRAPH = "show_raw_graph"; // moved to gear icon (per device settings) public static final String PREF_LANGUAGE = "language"; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/lenovo/watchxplus/WatchXPlusDeviceCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/lenovo/watchxplus/WatchXPlusDeviceCoordinator.java index 51c6d8e1f..c52901e59 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/lenovo/watchxplus/WatchXPlusDeviceCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/lenovo/watchxplus/WatchXPlusDeviceCoordinator.java @@ -258,8 +258,8 @@ public class WatchXPlusDeviceCoordinator extends AbstractDeviceCoordinator { LOG.info(" Long sit reminder is disabled "); return false; } else { - String end = prefs.getString(WatchXPlusConstants.PREF_LONGSIT_START, "06:00"); - String start = prefs.getString(WatchXPlusConstants.PREF_LONGSIT_END, "23:00"); + String start = prefs.getString(WatchXPlusConstants.PREF_LONGSIT_START, "06:00"); + String end = prefs.getString(WatchXPlusConstants.PREF_LONGSIT_END, "23:00"); DateFormat df = new SimpleDateFormat("HH:mm"); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/lenovo/watchxplus/WatchXPlusSampleProvider.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/lenovo/watchxplus/WatchXPlusSampleProvider.java index b2115a880..da3a268ad 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/lenovo/watchxplus/WatchXPlusSampleProvider.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/lenovo/watchxplus/WatchXPlusSampleProvider.java @@ -3,18 +3,31 @@ package nodomain.freeyourgadget.gadgetbridge.devices.lenovo.watchxplus; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.List; + import de.greenrobot.dao.AbstractDao; import de.greenrobot.dao.Property; +import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.devices.AbstractSampleProvider; import nodomain.freeyourgadget.gadgetbridge.entities.DaoSession; import nodomain.freeyourgadget.gadgetbridge.entities.WatchXPlusActivitySample; import nodomain.freeyourgadget.gadgetbridge.entities.WatchXPlusActivitySampleDao; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; +import nodomain.freeyourgadget.gadgetbridge.model.ActivityKind; +import nodomain.freeyourgadget.gadgetbridge.model.ActivitySample; public class WatchXPlusSampleProvider extends AbstractSampleProvider { private GBDevice mDevice; private DaoSession mSession; + private final float movementDivisor = 1500.0f; + + private static final Logger LOG = LoggerFactory.getLogger(WatchXPlusSampleProvider.class); + public WatchXPlusSampleProvider(GBDevice device, DaoSession session) { super(device, session); mSession = session; @@ -28,12 +41,22 @@ public class WatchXPlusSampleProvider extends AbstractSampleProvider getAllActivitySamples(int timestamp_from, int timestamp_to) { + boolean showRawData = GBApplication.getDeviceSpecificSharedPrefs(mDevice.getAddress()).getBoolean(WatchXPlusConstants.PREF_SHOW_RAW_GRAPH, false); + if (showRawData) { + return getGBActivitySamples(timestamp_from, timestamp_to, ActivityKind.TYPE_ALL); + } + List samples = getGBActivitySamples(timestamp_from, timestamp_to, ActivityKind.TYPE_ALL); + int numEntries = samples.size(); + if (numEntries < 2) { + return getGBActivitySamples(timestamp_from, timestamp_to, ActivityKind.TYPE_ALL); + } + + // LOG.info(" testing: ts_from:" + timestamp_from + " ts_to: " + timestamp_to); + + /* + LOG.info(" testing: samples: "); + for (int i = 0; i < numEntries; i++) { + LOG.info(" s: " + i + " : " + samples.get(i).toString()); + } +*/ + List resultList = new ArrayList<>(numEntries); + + // how many elements to scan for sleep sate before and after sleep block + int seekAhead = 10; + boolean secondBlock = false; + +// find sleep start and sleep stop index based on ActivityKind.TYPE_DEEP_SLEEP BLOCK 1 + int sleepStartIndex_1 = 0; + int sleepStopIndex_1 = numEntries; + int countNextSleepStart_1 = 0; + int countNextSleepStop_1 = 0; + + for (int i = 0; i < numEntries; i++) { + if (samples.get(i).getRawKind() == ActivityKind.TYPE_DEEP_SLEEP) { + // normalize RawIntensity + samples.get(i).setRawIntensity(1000); + // find sleep start index + if (sleepStartIndex_1 == 0) { + sleepStartIndex_1 = i; + sleepStopIndex_1 = sleepStartIndex_1; + countNextSleepStop_1 = sleepStopIndex_1; + } else { + if (countNextSleepStart_1 == 0) { + countNextSleepStart_1 = i; + // reset start index if next index is far ahead + if ((countNextSleepStart_1 - sleepStartIndex_1) > seekAhead * 2) { + sleepStartIndex_1 = countNextSleepStart_1; + sleepStopIndex_1 = sleepStartIndex_1; + countNextSleepStop_1 = sleepStopIndex_1; + } + } + } + + + if ((i - sleepStopIndex_1) < (seekAhead * 3)) { + sleepStopIndex_1 = i; + } + countNextSleepStop_1 = i; + } + } + +// find sleep start and sleep stop index based on ActivityKind.TYPE_DEEP_SLEEP BLOCK 2 + int sleepStartIndex_2 = 0; + int sleepStopIndex_2 = numEntries; + int countNextSleepStart_2 = 0; + int countNextSleepStop_2 = 0; + int next_block = numEntries; + + for (int i = sleepStopIndex_1 + 1; i < numEntries; i++) { + if (samples.get(i).getRawKind() == ActivityKind.TYPE_DEEP_SLEEP) { + // find sleep start index + if (sleepStartIndex_2 == 0) { + sleepStartIndex_2 = i; + sleepStopIndex_2 = sleepStartIndex_2; + countNextSleepStop_2 = sleepStopIndex_2; + } else { + if (countNextSleepStart_2 == 0) { + countNextSleepStart_2 = i; + // reset start index if next index is far ahead + if ((countNextSleepStart_2 - sleepStartIndex_2) > seekAhead * 2) { + sleepStartIndex_2 = countNextSleepStart_2; + sleepStopIndex_2 = sleepStartIndex_2; + countNextSleepStop_2 = sleepStopIndex_2; + } + } + } + if ((i - sleepStopIndex_2) < (seekAhead * 3)) { + sleepStopIndex_2 = i; + } + countNextSleepStop_2 = i; + } + } + if (sleepStartIndex_2 != 0) { + secondBlock = true; + LOG.info(" second block "); + } + + LOG.info(" sleep_1 begin index:" + sleepStartIndex_1 + " next index: " + countNextSleepStart_1 + " sleep end index: " + sleepStopIndex_1 + " sleep end: " + countNextSleepStop_1); + if (secondBlock) { + LOG.info(" sleep_2 begin index:" + sleepStartIndex_2 + " next index: " + countNextSleepStart_2 + " sleep end index: " + sleepStopIndex_2 + " sleep end: " + countNextSleepStop_2); + } + +// SLEEP BLOCK 1 + // add all activity before sleep start + if (secondBlock) { + next_block = sleepStartIndex_2; + } + int newSleepStartIndex_1 = 0; + if (sleepStartIndex_1 >= seekAhead) { + newSleepStartIndex_1 = sleepStartIndex_1 - seekAhead; + } else { + newSleepStartIndex_1 = 0; + } + for (int i = 0; i < newSleepStartIndex_1; i++) { + if (samples.get(i).getRawKind() == ActivityKind.TYPE_LIGHT_SLEEP) { + if (samples.get(i).getRawIntensity() <= 300) { + samples.get(i).setRawIntensity(200); + } else if ((samples.get(i).getRawIntensity() <= 1000) && (samples.get(i).getRawIntensity() > 100)) { + samples.get(i).setRawIntensity(400); + } if (samples.get(i).getRawIntensity() > 1000) { + samples.get(i).setRawIntensity(600); + } + samples.get(i).setRawKind(1); + resultList.add(samples.get(i)); + } else { + if (samples.get(i).getRawKind() == ActivityKind.TYPE_ACTIVITY) { + if (i < (newSleepStartIndex_1 - 3)) { + if ((samples.get(i + 1).getRawKind() == ActivityKind.TYPE_LIGHT_SLEEP) || (samples.get(i + 2).getRawKind() == ActivityKind.TYPE_LIGHT_SLEEP) || (samples.get(i + 3).getRawKind() == ActivityKind.TYPE_LIGHT_SLEEP)) { + samples.get(i).setRawKind(1); + //samples.get(i).setRawIntensity(700); + } else { + samples.get(i).setRawIntensity(1000); + } + } + //samples.get(i).setRawIntensity(1000); + } else { + samples.get(i).setRawIntensity(1000); + } + resultList.add(samples.get(i)); + } + } + +// add sleep activity + int newSleepStopIndex_1; + + if ((sleepStopIndex_1 + seekAhead) < next_block) { + newSleepStopIndex_1 = sleepStopIndex_1 + seekAhead * 2; + } else { + newSleepStopIndex_1 = next_block; + } + + boolean replaceActivity_1 = false; + for (int i = newSleepStartIndex_1; i < newSleepStopIndex_1; i++) { + ActivitySample sample = samples.get(i); + if (i < sleepStartIndex_1) { + if (samples.get(i).getRawKind() == ActivityKind.TYPE_LIGHT_SLEEP) { + replaceActivity_1 = true; + samples.get(i).setRawIntensity(600); + resultList.add(samples.get(i)); + } else { + if (replaceActivity_1) { + samples.get(i).setRawKind(2); + samples.get(i).setRawIntensity(600); + resultList.add(samples.get(i)); + } else { + samples.get(i).setRawIntensity(600); + resultList.add(samples.get(i)); + } + } + } + if ((samples.get(i).getRawKind() == ActivityKind.TYPE_DEEP_SLEEP) || (samples.get(i).getRawKind() == ActivityKind.TYPE_LIGHT_SLEEP)) { + if (samples.get(i).getRawKind() == ActivityKind.TYPE_LIGHT_SLEEP) { + if (i > 0) { + if (samples.get(i - 1).getHeartRate() > 0) { + samples.get(i).setHeartRate(samples.get(i - 1).getHeartRate()); + } + } else { + if (samples.get(i + 1).getHeartRate() > 0) { + samples.get(i).setHeartRate(samples.get(i + 1).getHeartRate()); + } + } + samples.get(i).setRawIntensity(600); + resultList.add(samples.get(i)); + } else { + samples.get(i).setRawIntensity(1000); + resultList.add(samples.get(i)); + } + } + + if ((samples.get(i).getRawKind() == ActivityKind.TYPE_LIGHT_SLEEP) && (i > sleepStopIndex_1)) { + samples.get(i).setRawIntensity(600); + resultList.add(samples.get(i)); + } + } + + +// add remaining activity + if (newSleepStopIndex_1 < next_block) { + for (int i = newSleepStopIndex_1; i < (next_block-1); i++) { + if (samples.get(i).getRawKind() == ActivityKind.TYPE_LIGHT_SLEEP) { + if (samples.get(i).getRawIntensity() <= 300) { + samples.get(i).setRawIntensity(200); + } else if ((samples.get(i).getRawIntensity() <= 1000) && (samples.get(i).getRawIntensity() > 100)) { + samples.get(i).setRawIntensity(400); + } if (samples.get(i).getRawIntensity() > 1000) { + samples.get(i).setRawIntensity(600); + } + samples.get(i).setRawKind(1); + resultList.add(samples.get(i)); + } else { + if (samples.get(i).getRawKind() == ActivityKind.TYPE_ACTIVITY) { + if (i < (next_block - 3)) { + if ((samples.get(i + 1).getRawKind() == ActivityKind.TYPE_LIGHT_SLEEP) || (samples.get(i + 2).getRawKind() == ActivityKind.TYPE_LIGHT_SLEEP) || (samples.get(i + 3).getRawKind() == ActivityKind.TYPE_LIGHT_SLEEP)) { + samples.get(i).setRawKind(1); + //samples.get(i).setRawIntensity(700); + } else { + samples.get(i).setRawIntensity(1000); + } + } + //samples.get(i).setRawIntensity(1000); + } else { + samples.get(i).setRawIntensity(1000); + } + resultList.add(samples.get(i)); + } + } + } + + if (!secondBlock) { + samples.get(next_block-1).setRawIntensity(100); + samples.get(next_block-1).setRawKind(-1); + resultList.add(samples.get(next_block-1)); + return resultList; + } + +// SLEEP BLOCK 2 +// add sleep activity + int newSleepStopIndex_2; + int newSleepStartIndex_2 = 0; + boolean replaceActivity_2 = false; + if (sleepStartIndex_2 >= next_block + seekAhead) { + newSleepStartIndex_2 = sleepStartIndex_2 - seekAhead; + } else { + newSleepStartIndex_2 = next_block; + } + if ((sleepStopIndex_2 + seekAhead) < numEntries) { + newSleepStopIndex_2 = sleepStopIndex_2 + seekAhead; + } else { + newSleepStopIndex_2 = numEntries; + } + for (int i = newSleepStartIndex_2; i < newSleepStopIndex_2; i++) { + ActivitySample sample = samples.get(i); + if (i < sleepStartIndex_2) { + if (samples.get(i).getRawKind() == ActivityKind.TYPE_LIGHT_SLEEP) { + replaceActivity_2 = true; + samples.get(i).setRawIntensity(600); + resultList.add(samples.get(i)); + } else { + if (replaceActivity_2) { + samples.get(i).setRawKind(2); + samples.get(i).setRawIntensity(600); + resultList.add(samples.get(i)); + } else { + samples.get(i).setRawIntensity(600); + resultList.add(samples.get(i)); + } + } + } + + + if ((samples.get(i).getRawKind() == ActivityKind.TYPE_DEEP_SLEEP) || (samples.get(i).getRawKind() == ActivityKind.TYPE_LIGHT_SLEEP)) { + if (samples.get(i).getRawKind() == ActivityKind.TYPE_LIGHT_SLEEP) { + if (i > 0) { + if (samples.get(i - 1).getHeartRate() > 0) { + samples.get(i).setHeartRate(samples.get(i - 1).getHeartRate()); + } + } else { + if (samples.get(i + 1).getHeartRate() > 0) { + samples.get(i).setHeartRate(samples.get(i + 1).getHeartRate()); + } + } + samples.get(i).setRawIntensity(600); + resultList.add(samples.get(i)); + } else { + samples.get(i).setRawIntensity(1000); + resultList.add(samples.get(i)); + } + } + if ((samples.get(i).getRawKind() == ActivityKind.TYPE_LIGHT_SLEEP) && (i > sleepStopIndex_2)) { + samples.get(i).setRawIntensity(600); + resultList.add(samples.get(i)); + } + } + + // add remaining activity + if (newSleepStopIndex_2 < numEntries) { + for (int i = newSleepStopIndex_2; i < (numEntries-1); i++) { + if (samples.get(i).getRawKind() == ActivityKind.TYPE_LIGHT_SLEEP) { + if (samples.get(i).getRawIntensity() <= 300) { + samples.get(i).setRawIntensity(200); + } else if ((samples.get(i).getRawIntensity() <= 1000) && (samples.get(i).getRawIntensity() > 100)) { + samples.get(i).setRawIntensity(400); + } if (samples.get(i).getRawIntensity() > 1000) { + samples.get(i).setRawIntensity(600); + } + samples.get(i).setRawKind(1); + resultList.add(samples.get(i)); + } else { + if (samples.get(i).getRawKind() == ActivityKind.TYPE_ACTIVITY) { + if (i < (numEntries - 3)) { + if ((samples.get(i + 1).getRawKind() == ActivityKind.TYPE_LIGHT_SLEEP) || (samples.get(i + 2).getRawKind() == ActivityKind.TYPE_LIGHT_SLEEP) || (samples.get(i + 3).getRawKind() == ActivityKind.TYPE_LIGHT_SLEEP)) { + samples.get(i).setRawKind(1); + //samples.get(i).setRawIntensity(700); + } else { + samples.get(i).setRawIntensity(1000); + } + } + //samples.get(i).setRawIntensity(1000); + } else { + samples.get(i).setRawIntensity(1000); + } + resultList.add(samples.get(i)); + } + } + } + samples.get(numEntries-1).setRawIntensity(-1); + samples.get(numEntries-1).setRawKind(-1); + resultList.add(samples.get(numEntries-1)); + return resultList; + } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/lenovo/watchxplus/WatchXPlusDeviceSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/lenovo/watchxplus/WatchXPlusDeviceSupport.java index 7699b0a97..4440d7944 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/lenovo/watchxplus/WatchXPlusDeviceSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/lenovo/watchxplus/WatchXPlusDeviceSupport.java @@ -90,9 +90,6 @@ import nodomain.freeyourgadget.gadgetbridge.util.GB; import nodomain.freeyourgadget.gadgetbridge.util.Prefs; import nodomain.freeyourgadget.gadgetbridge.util.StringUtils; -import static nodomain.freeyourgadget.gadgetbridge.GBApplication.getContext; -import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF_LANGUAGE; - public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport { private static final Prefs prefs = GBApplication.getPrefs(); @@ -1018,15 +1015,17 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport { */ private void setLongSitHours(TransactionBuilder builder, boolean enable, int hourStart, int minuteStart, int hourEnd, int minuteEnd, int period) { LOG.info(" Setting Long sit reminder... Enabled:"+enable+" Period:"+period); - LOG.info(" Setting Long sit time... Hs:"+hourEnd+" Ms:"+minuteEnd+" He:"+hourStart+" Me:"+minuteStart); + LOG.info(" Setting Long sit time... Hs:"+hourStart+" Ms:"+minuteStart+" He:"+hourEnd+" Me:"+minuteEnd); // set Long Sit reminder time byte[] command = WatchXPlusConstants.CMD_INACTIVITY_REMINDER_SET; byte[] bArr = new byte[10]; + // do not remind bArr[0] = (byte) hourEnd; // byte[08] bArr[1] = (byte) minuteEnd; // byte[09] bArr[2] = (byte) hourStart; // byte[10] bArr[3] = (byte) minuteStart; // byte[11] + // remind bArr[4] = (byte) hourStart; // byte[12] bArr[5] = (byte) minuteStart; // byte[13] bArr[6] = (byte) hourEnd; // byte[14] @@ -1506,13 +1505,13 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport { } else if (ArrayUtils.equals(value, WatchXPlusConstants.RESP_DAY_STEPS_INDICATOR, 5)) { handleStepsInfo(value); } else if (ArrayUtils.equals(value, WatchXPlusConstants.RESP_DATA_COUNT, 5)) { - LOG.info(" Received data count "); + LOG.info(" Received data count: " + value); handleDataCount(value); } else if (ArrayUtils.equals(value, WatchXPlusConstants.RESP_DATA_DETAILS, 5)) { - LOG.info(" Received data details "); + LOG.info(" Received data details: " + value); handleDataDetails(value); } else if (ArrayUtils.equals(value, WatchXPlusConstants.RESP_DATA_CONTENT, 5)) { - LOG.info(" Received data content "); + LOG.info(" Received data content: " + value); handleDataContentAck(value); } else if (ArrayUtils.equals(value, WatchXPlusConstants.RESP_BP_MEASURE_STARTED, 5)) { handleBpMeasureResult(value); @@ -1707,7 +1706,7 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport { } int tsWithOffset = requestedDataTimestamp + (((((chunkNo * 16) / 2) + ((i - 4) / 2)) *5) * 60) - timezoneOffset; - LOG.debug(" requested timestamp " + requestedDataTimestamp + " chunkNo " + chunkNo + " Got data: " + new Date((long) tsWithOffset * 1000) + ", value: " + val); + LOG.debug(" SLEEP requested timestamp " + requestedDataTimestamp + " chunkNo " + chunkNo + " Got data: " + new Date((long) tsWithOffset * 1000) + ", rawIntensity: " + val); WatchXPlusActivitySample sample = createSample(dbHandler, tsWithOffset); sample.setTimestamp(tsWithOffset); sample.setProvider(provider); @@ -1729,7 +1728,7 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport { break; } int tsWithOffset = requestedDataTimestamp + (((((chunkNo * 16) + i) - 4) * 2) * 60) - timezoneOffset; -// LOG.debug(" requested timestamp " + requestedDataTimestamp + " chunkNo " + chunkNo + " Got data: " + new Date((long) tsWithOffset * 1000) + ", value: " + val); + LOG.debug(" HEART RATE requested timestamp " + requestedDataTimestamp + " chunkNo " + chunkNo + " Got data: " + new Date((long) tsWithOffset * 1000) + ", value: " + val); WatchXPlusActivitySample sample = createSample(dbHandler, tsWithOffset); sample.setTimestamp(tsWithOffset); sample.setHeartRate(val); @@ -1742,6 +1741,16 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport { handleEndOfDataChunks(chunkNo, type); } else { LOG.warn(" Got unsupported data package type: " + type); + + for (int i = 4; i < value.length; i++) { + int val = Conversion.fromByteArr16(value[i], value[i+1]); + if (65535 == val) { + break; + } + int tsWithOffset = requestedDataTimestamp + (((((chunkNo * 16) / 2) + ((i - 4) / 2)) *5) * 60) - timezoneOffset; + LOG.debug(" UNSUPPORTED requested timestamp for type: " + type + " " + requestedDataTimestamp + " chunkNo " + chunkNo + " Got data: " + new Date((long) tsWithOffset * 1000) + ", rawIntensity: " + val); + } + } } catch (Exception ex) { LOG.warn((ex.getMessage())); diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index ba67773ef..839be00c8 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -302,6 +302,7 @@ Настройки на устройството Принудително синхронизирай часа Принудително синхронизирай дата и час при свързване. Стрелките може да показват грешно време. + Покажи графика в суров вид Калибриране на сензорите Калибриране на височината @@ -310,10 +311,6 @@ Кръвно налягане SYSTOLIC (висока) Калибриране Натисни тук за калибриране - - Напомни ако няма активност за повече от X минути - Напомняне за бездействие - Период на неактивност (минути) Режим на часовника Нормален @@ -556,6 +553,9 @@ Край Начало Не безпокой + Предупреждение за бездействие + Устройството ще вибрира ако бездействате за известно време + Период на бездействие (в минути) Вие спахте от %1$s до %2$s Стъпки: %1$02d Сън: %1$s diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 1d3cccde9..76867ffae 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -850,4 +850,32 @@ Amazfit Bip S Intensitat de vibració Recollida automàtica + Entrenament + Recordatori d\'esdeveniment + Ritme cardíac + Watch X Plus + Watch X + Només rellotge + Estalvi d\'energia + Normal + Període d\'inactivitat (minuts) + Recordatori d\'inactivitat + Prem aquí per començar la calibració + Calibració + Calibració de la pressió sanguínia + Calibració d\'altitud + Calibració de sensors + Configuració de l\'aparell + Duplica l\'acció del botó del rellotge + Sacseja el canell per a ignorar/rebutjar la trucada + Off - ignora, On - rebutja + Botó d\'ignorar/rebutjar trucada + Gestió de trucades + Repetex durant X minuts + Es repeteix a cada minut + Notifica les trucades perdudes + Notificació durant el to de trucada + Repeteix la notificació de trucada + Notificacions i trucades + Calibració del Watch X Plus \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 705a056f8..1ad6feb0c 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -863,4 +863,17 @@ Widget-Kreise zeichnen Automatischer Abruf Raw Activity Dateien speichern + Training + Herzfrequenz + Watch X Plus + Watch X + Kalibrierung + Blutdruck SYSTOLISCH (hoch) + Blutdruck DIASTOLISCH (niedrig) + Blutdruckkalibrierung + Höhenkalibrierung + Sensorkalibrierung + Synchronisierungszeit erzwingen + Geräteeinstellungen + Benachrichtigungen und Anrufe \ No newline at end of file diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index da006b7c2..512584203 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -860,4 +860,35 @@ תזכורת אירועים דופק בינת פעילות + Watch X Plus + Watch X + צריכת חשמל בשעון + כפיל של פעולת כפתור השעון + שעון בלבד + חיסכון בחשמל + רגיל + משך חוסר פעילות (דקות) + תזכורת חוסר פעילות + להזכיר לי במקרה של חוסר פעילות למשך X דקות + יש ללחוץ כאן כדי להתחיל כיול + כיול + לחץ דם סיסטולי (גבוה) + לחץ דם דיאסטולי (נמוך) + כיוון לחץ דם + כיוון גובה + אילוץ סנכרון השעון בעת התחברות מחדש. מחוגים אנלוגיים עשויים להציג שעה שגויה! + כיול חיישנים + אילוץ סנכרון השעון + הגדרות התקן + ניעור פרק כף היד כדי להתעלם/לדחות שיחות + כבוי - התעלמות, פעיל - דחייה + התעלמות/דחייה עם כפתור + טיפול בשיחות + חזרה למשך X דקות + חוזרת כל דקה + התראה על שיחה שהוחמצה + התראות ושיחות + חזרה על התראות על שיחות + התראה במהלך צלצול טלפון + כיול Watch X Plus \ No newline at end of file diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 5047cf645..e2b553e2c 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -859,4 +859,7 @@ Hendelsespåminnelse Puls Lagre råfiler fra aktivitet + Trykk her for å starte kalibrering + Kalibrering + Enhetsinnstillinger \ No newline at end of file diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index ebb8a54a7..332c29199 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -853,4 +853,40 @@ Ontspannen firmwarecontroles Automatisch ophalen Teken widget cirkels + Bewaar onbewerkte activiteitsbestanden + Training + Gebeurtenis herinnering + Hartslag + PAI + Watch X Plus + Watch X + Alleen horloge + Energiebesparing + Normaal + Horloge energie mode + Inactiviteitsperiode (minuten) + Inactiviteit herinnering + Herinneren als er X minuten inactiviteit is + Druk hier om te beginnen met kalibreren + Kalibratie + Bloeddruk SYSTOLISCH (hoog) + Bloeddruk DIASTOLISCH (laag) + Bloeddruk kalibratie + Hoogte kalibratie + Sensoren Kalibratie + Forceer automatische tijd synchronisatie bij opnieuw verbinden. Analoge wijzers kunnen een onjuiste tijd aangeven! + Forceer tijdsynchronisatie + Apparaat instellingen + Dupliceert horlogeknop actie + "Schud pols: negeer / weiger oproep" + Uit - negeren, Aan - weigeren + Knop oproep negeren / weigeren + Gespreksafhandeling + Herhaal gedurende X minuten + Herhaalt elke minuut + Melding voor een gemist gesprek + Melding tijdens het bellen + Herhaal oproepmelding + Meldingen en oproepen + Watch X Plus-kalibratie \ No newline at end of file diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 7212d8cba..199a5d3c2 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -858,4 +858,18 @@ 事件提醒 心率 PAI + 强制时间同步 + 设备设置 + 重复手表按钮操作 + 晃动手腕以忽略/拒接来电 + 关 - 忽略,开 - 拒接 + 按钮忽略或拒接来电 + 来电处理 + X 分钟重复一次 + 每分钟重复 + 通知未接来电 + 响铃时通知 + 重复来电通知 + 通知和来电 + WatchXPlus 首选项 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3fd4aee62..34ada6992 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -216,6 +216,7 @@ Device settings Force synchronize time Force auto synchronize time on reconnect. Analog hands may show incorrect time! + Show RAW data on activity graph Sensors Calibration Altitude calibration @@ -224,10 +225,6 @@ Blood Pressure SYSTOLIC (high) Calibration Press here to begin calibration - - Remind if there are inactivity for X minutes - Inactivity reminder - Inactivity period (minutes) Watch power mode Normal diff --git a/app/src/main/res/xml/devicesettings_longsit.xml b/app/src/main/res/xml/devicesettings_longsit.xml index 0f199cdb5..500e22b30 100644 --- a/app/src/main/res/xml/devicesettings_longsit.xml +++ b/app/src/main/res/xml/devicesettings_longsit.xml @@ -4,21 +4,21 @@ android:icon="@drawable/ic_activity_sleep" android:key="screen_longsit" android:persistent="false" - android:summary="@string/pref_summary_longsit" - android:title="@string/prefs_longsit_switch"> + android:summary="@string/mi2_prefs_inactivity_warnings_summary" + android:title="@string/mi2_prefs_inactivity_warnings"> - + + android:title="@string/mi2_prefs_inactivity_warnings" /> + android:summary="@string/mi2_prefs_inactivity_warnings_summary" + android:title="@string/mi2_prefs_inactivity_warnings_threshold"/> +