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

Merge branch 'master' of https://codeberg.org/Freeyourgadget/Gadgetbridge into fosisl-q-hr-html

This commit is contained in:
Daniel Dakhno 2020-03-01 22:24:25 +01:00
commit f0384e05d5
56 changed files with 1117 additions and 374 deletions

View File

@ -1,5 +1,9 @@
### Changelog
#### Version 0.42.1
* Fix accepting/rejecting calls on Android 9
* Mi Band 3/4, Amazfit Bip/Cor/GTS/GTR: Option to sync calender events as reminder
#### Version 0.42.0
* Initial iTag support
* Fix indefinitely lasting bluetooth scans when location permission has not been granted

View File

@ -22,11 +22,11 @@ android {
defaultConfig {
applicationId "nodomain.freeyourgadget.gadgetbridge"
minSdkVersion 19
targetSdkVersion 27
targetSdkVersion 28
// Note: always bump BOTH versionCode and versionName!
versionName "0.42.0"
versionCode 167
versionName "0.43.0"
versionCode 169
vectorDrawables.useSupportLibrary = true
}
buildTypes {
@ -73,7 +73,7 @@ dependencies {
implementation "androidx.recyclerview:recyclerview:1.1.0"
implementation "androidx.legacy:legacy-support-v4:1.0.0"
implementation "androidx.gridlayout:gridlayout:1.0.0"
implementation "com.google.android.material:material:1.0.0"
implementation "com.google.android.material:material:1.1.0"
implementation "androidx.palette:palette:1.0.0"
implementation("com.github.tony19:logback-android-classic:1.1.1-6") {
exclude group: "com.google.android", module: "android"

View File

@ -11,6 +11,7 @@
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />

View File

@ -344,6 +344,10 @@ public class GBApplication extends Application {
return VERSION.SDK_INT >= Build.VERSION_CODES.O;
}
public static boolean isRunningPieOrLater() {
return VERSION.SDK_INT >= Build.VERSION_CODES.P;
}
private static boolean isPrioritySender(int prioritySenders, String number) {
if (prioritySenders == Policy.PRIORITY_SENDERS_ANY) {
return true;

View File

@ -66,12 +66,12 @@ public class Widget extends AppWidgetProvider {
return gbApp.getDeviceManager().getSelectedDevice();
}
private int[] getSteps() {
private long[] getSteps() {
Context context = GBApplication.getContext();
Calendar day = GregorianCalendar.getInstance();
if (!(context instanceof GBApplication)) {
return new int[]{0, 0, 0};
return new long[]{0, 0, 0};
}
DailyTotals ds = new DailyTotals();
return ds.getDailyTotalsForAllDevices(day);
@ -114,10 +114,10 @@ public class Widget extends AppWidgetProvider {
}
int[] DailyTotals = getSteps();
long[] dailyTotals = getSteps();
views.setTextViewText(R.id.todaywidget_steps, context.getString(R.string.widget_steps_label, (int) DailyTotals[0]));
views.setTextViewText(R.id.todaywidget_sleep, context.getString(R.string.widget_sleep_label, getHM((long) DailyTotals[1])));
views.setTextViewText(R.id.todaywidget_steps, context.getString(R.string.widget_steps_label, dailyTotals[0]));
views.setTextViewText(R.id.todaywidget_sleep, context.getString(R.string.widget_sleep_label, getHM(dailyTotals[1])));
if (device != null) {
String status = String.format("%1s", device.getStateString());

View File

@ -218,12 +218,6 @@ public class ControlCenterv2 extends AppCompatActivity
} else {
GBApplication.deviceService().requestDeviceInfo();
}
List<GBDevice> devices = deviceManager.getDevices();
if(devices.size() > 0){
GBApplication.deviceService().connect(devices.get(0));
}
}
@Override
@ -349,6 +343,8 @@ public class ControlCenterv2 extends AppCompatActivity
wantedPermissions.add(Manifest.permission.READ_CONTACTS);
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_DENIED)
wantedPermissions.add(Manifest.permission.CALL_PHONE);
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ANSWER_PHONE_CALLS) == PackageManager.PERMISSION_DENIED)
wantedPermissions.add(Manifest.permission.ANSWER_PHONE_CALLS);
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CALL_LOG) == PackageManager.PERMISSION_DENIED)
wantedPermissions.add(Manifest.permission.READ_CALL_LOG);
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_DENIED)

View File

@ -23,4 +23,5 @@ public class DeviceSettingsPreferenceConst {
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";
public static final String PREF_SYNC_CALENDAR = "sync_calendar";
}

View File

@ -291,8 +291,7 @@ public class GBDeviceAdapterv2 extends RecyclerView.Adapter<GBDeviceAdapterv2.Vi
return;
}
GBApplication.deviceService().onFindDevice(true);
//TODO: extract string resource if we like this solution.
Snackbar.make(parent, R.string.control_center_find_lost_device, Snackbar.LENGTH_INDEFINITE).setAction("Found it!", new View.OnClickListener() {
Snackbar.make(parent, R.string.control_center_find_lost_device, Snackbar.LENGTH_INDEFINITE).setAction(R.string.find_lost_device_you_found_it, new View.OnClickListener() {
@Override
public void onClick(View v) {
GBApplication.deviceService().onFindDevice(false);

View File

@ -21,17 +21,17 @@ import android.bluetooth.BluetoothClass;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.le.ScanFilter;
import androidx.annotation.NonNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Collection;
import java.util.Collections;
import androidx.annotation.NonNull;
import de.greenrobot.dao.query.QueryBuilder;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.GBException;
import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.database.DBHandler;
import nodomain.freeyourgadget.gadgetbridge.database.DBHelper;
import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst;
@ -41,6 +41,7 @@ import nodomain.freeyourgadget.gadgetbridge.entities.DeviceAttributesDao;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDeviceCandidate;
import nodomain.freeyourgadget.gadgetbridge.util.Prefs;
import static nodomain.freeyourgadget.gadgetbridge.GBApplication.getPrefs;
public abstract class AbstractDeviceCoordinator implements DeviceCoordinator {
@ -177,7 +178,6 @@ public abstract class AbstractDeviceCoordinator implements DeviceCoordinator {
@Override
public int[] getSupportedDeviceSpecificSettings(GBDevice device) {
return new int[] {R.xml.devicesettings_pairingkey };
return null;
}
}

View File

@ -86,6 +86,7 @@ public class AmazfitBipCoordinator extends HuamiCoordinator {
R.xml.devicesettings_custom_emoji_font,
R.xml.devicesettings_liftwrist_display,
R.xml.devicesettings_disconnectnotification,
R.xml.devicesettings_sync_calendar,
R.xml.devicesettings_expose_hr_thirdparty,
R.xml.devicesettings_buttonactions_with_longpress,
R.xml.devicesettings_pairingkey

View File

@ -89,6 +89,7 @@ public class AmazfitCorCoordinator extends HuamiCoordinator {
R.xml.devicesettings_custom_emoji_font,
R.xml.devicesettings_liftwrist_display,
R.xml.devicesettings_disconnectnotification,
R.xml.devicesettings_sync_calendar,
R.xml.devicesettings_expose_hr_thirdparty,
R.xml.devicesettings_pairingkey
};

View File

@ -91,6 +91,7 @@ public class AmazfitCor2Coordinator extends HuamiCoordinator {
R.xml.devicesettings_custom_emoji_font,
R.xml.devicesettings_liftwrist_display,
R.xml.devicesettings_disconnectnotification,
R.xml.devicesettings_sync_calendar,
R.xml.devicesettings_expose_hr_thirdparty,
R.xml.devicesettings_pairingkey
};

View File

@ -93,6 +93,7 @@ public class AmazfitGTRCoordinator extends HuamiCoordinator {
R.xml.devicesettings_timeformat,
R.xml.devicesettings_liftwrist_display,
R.xml.devicesettings_disconnectnotification,
R.xml.devicesettings_sync_calendar,
R.xml.devicesettings_expose_hr_thirdparty,
R.xml.devicesettings_pairingkey
};

View File

@ -93,6 +93,7 @@ public class AmazfitGTSCoordinator extends HuamiCoordinator {
R.xml.devicesettings_timeformat,
R.xml.devicesettings_liftwrist_display,
R.xml.devicesettings_disconnectnotification,
R.xml.devicesettings_sync_calendar,
R.xml.devicesettings_expose_hr_thirdparty,
R.xml.devicesettings_pairingkey
};

View File

@ -110,6 +110,7 @@ public class MiBand3Coordinator extends HuamiCoordinator {
R.xml.devicesettings_donotdisturb_withauto,
R.xml.devicesettings_liftwrist_display,
R.xml.devicesettings_swipeunlock,
R.xml.devicesettings_sync_calendar,
R.xml.devicesettings_expose_hr_thirdparty,
R.xml.devicesettings_pairingkey
};

View File

@ -96,6 +96,7 @@ public class MiBand4Coordinator extends HuamiCoordinator {
R.xml.devicesettings_nightmode,
R.xml.devicesettings_liftwrist_display,
R.xml.devicesettings_swipeunlock,
R.xml.devicesettings_sync_calendar,
R.xml.devicesettings_expose_hr_thirdparty,
R.xml.devicesettings_pairingkey,
R.xml.devicesettings_high_mtu

View File

@ -11,9 +11,12 @@ import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@ -205,7 +208,7 @@ public class HRConfigActivity extends AbstractGBActivity implements View.OnClick
for (int i = 0; i < customWidgets.length(); i++) {
JSONObject customWidgetObject = customWidgets.getJSONObject(i);
CustomWidget widget = new CustomWidget(
customWidgetObject.getString("name"), 0, 0
customWidgetObject.getString("name"), 0, 0, "default" // FIXME: handle force white background
);
JSONArray elements = customWidgetObject.getJSONArray("elements");
@ -375,7 +378,8 @@ public class HRConfigActivity extends AbstractGBActivity implements View.OnClick
public void onItemClick(AdapterView<?> parent, View view, final int position, long id) {
final EditText input = new EditText(this);
input.setId(0);
input.setText(((TextView) view).getText());
TextView subject = findViewById(0);
input.setText(subject.getText());
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT);
@ -407,6 +411,22 @@ public class HRConfigActivity extends AbstractGBActivity implements View.OnClick
.show();
}
private void moveActionUp(int position){
this.menuActions.add(position - 1, this.menuActions.remove(position));
this.actionListAdapter.notifyDataSetChanged();
putActionItems(menuActions);
LocalBroadcastManager.getInstance(HRConfigActivity.this).sendBroadcast(new Intent(QHybridSupport.QHYBRID_COMMAND_OVERWRITE_BUTTONS));
}
private void moveActionDown(int position){
this.menuActions.add(position + 1, this.menuActions.remove(position));
this.actionListAdapter.notifyDataSetChanged();
putActionItems(menuActions);
LocalBroadcastManager.getInstance(HRConfigActivity.this).sendBroadcast(new Intent(QHybridSupport.QHYBRID_COMMAND_OVERWRITE_BUTTONS));
}
private void putActionItems(List<MenuAction> actions) {
JSONArray array = new JSONArray();
for (MenuAction action : actions) array.put(action.getAction());
@ -456,15 +476,57 @@ public class HRConfigActivity extends AbstractGBActivity implements View.OnClick
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
if (convertView == null) convertView = new TextView(getContext());
TextView view = (TextView) convertView;
public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
RelativeLayout layout = new RelativeLayout(getContext());
view.setText(getItem(position).getAction());
TextView text = new TextView(getContext());
text.setId(0);
text.setText(getItem(position).getAction());
// view.setTextColor(Color.WHITE);
view.setTextSize(25);
text.setTextSize(25);
RelativeLayout.LayoutParams textParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
textParams.addRule(RelativeLayout.ALIGN_PARENT_START, RelativeLayout.TRUE);
layout.addView(text);
return view;
try {
getItem(position + 1);
ImageView downView = new ImageView(getContext());
downView.setImageResource(R.drawable.ic_arrow_upward);
downView.setRotation(180);
RelativeLayout.LayoutParams downParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);
downParams.addRule(RelativeLayout.ALIGN_PARENT_END, RelativeLayout.TRUE);
downView.setLayoutParams(downParams);
downView.setId(2);
downView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
moveActionDown(position);
}
});
layout.addView(downView);
}catch (IndexOutOfBoundsException e){
// no following item
}
if (position != 0) {
ImageView upView = new ImageView(getContext());
upView.setImageResource(R.drawable.ic_arrow_upward);
RelativeLayout.LayoutParams upParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);
upParams.setMarginEnd(100);
upParams.addRule(RelativeLayout.ALIGN_PARENT_END, RelativeLayout.TRUE);
upView.setLayoutParams(upParams);
upView.setId(1);
upView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
moveActionUp(position);
}
});
layout.addView(upView);
}
return layout;
}
}
}

View File

@ -1,18 +1,33 @@
package nodomain.freeyourgadget.gadgetbridge.devices.qhybrid;
import android.util.Log;
import java.io.Serializable;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.PlayNotificationRequest;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.zip.CRC32;
public class NotificationHRConfiguration implements Serializable {
private String packageName;
private long id = -1;
private byte[] packageCrc;
public NotificationHRConfiguration(String packageName, long id) {
this.packageName = packageName;
this.id = id;
CRC32 crc = new CRC32();
crc.update(packageName.getBytes());
this.packageCrc = ByteBuffer
.allocate(4)
.order(ByteOrder.LITTLE_ENDIAN)
.putInt((int) crc.getValue())
.array();
}
public NotificationHRConfiguration(String packageName, byte[] packageCrc, long id) {
this.id = id;
this.packageCrc = packageCrc;
this.packageName = packageName;
}
public String getPackageName() {
@ -22,4 +37,8 @@ public class NotificationHRConfiguration implements Serializable {
public long getId() {
return id;
}
public byte[] getPackageCrc() {
return packageCrc;
}
}

View File

@ -19,26 +19,22 @@ package nodomain.freeyourgadget.gadgetbridge.devices.qhybrid;
import android.annotation.TargetApi;
import android.app.Activity;
import android.bluetooth.le.ScanCallback;
import android.bluetooth.le.ScanFilter;
import android.content.Context;
import android.net.Uri;
import android.os.Build;
import android.os.ParcelUuid;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import java.util.Collection;
import java.util.Collections;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.GBException;
import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.devices.AbstractDeviceCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.DeviceCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.InstallHandler;
import nodomain.freeyourgadget.gadgetbridge.devices.SampleProvider;
import nodomain.freeyourgadget.gadgetbridge.entities.DaoSession;
@ -48,9 +44,7 @@ import nodomain.freeyourgadget.gadgetbridge.impl.GBDeviceCandidate;
import nodomain.freeyourgadget.gadgetbridge.model.ActivitySample;
import nodomain.freeyourgadget.gadgetbridge.model.DeviceType;
import nodomain.freeyourgadget.gadgetbridge.model.ItemWithDetails;
import nodomain.freeyourgadget.gadgetbridge.service.DeviceCommunicationService;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.QHybridSupport;
import nodomain.freeyourgadget.gadgetbridge.util.DeviceHelper;
public class QHybridCoordinator extends AbstractDeviceCoordinator {
@NonNull
@ -85,7 +79,7 @@ public class QHybridCoordinator extends AbstractDeviceCoordinator {
@Override
public boolean supportsActivityDataFetching() {
return true;
return false;
}
@Override
@ -113,7 +107,7 @@ public class QHybridCoordinator extends AbstractDeviceCoordinator {
return false;
}
public boolean supportsAlarmConfiguration() {
private boolean supportsAlarmConfiguration() {
GBDevice connectedDevice = GBApplication.app().getDeviceManager().getSelectedDevice();
if(connectedDevice == null || connectedDevice.getType() != DeviceType.FOSSILQHYBRID || connectedDevice.getState() != GBDevice.State.INITIALIZED){
return false;
@ -136,8 +130,6 @@ public class QHybridCoordinator extends AbstractDeviceCoordinator {
return false;
}
@Override
public String getManufacturer() {
return "Fossil";
@ -150,9 +142,7 @@ public class QHybridCoordinator extends AbstractDeviceCoordinator {
@Override
public Class<? extends Activity> getAppsManagementActivity() {
GBDevice connectedDevice = GBApplication.app().getDeviceManager().getSelectedDevice();
boolean isHR = connectedDevice.getFirmwareVersion().charAt(2) == '1';
return isHR ? HRConfigActivity.class : ConfigActivity.class;
return isHybridHR() ? HRConfigActivity.class : ConfigActivity.class;
}
@Override
@ -167,7 +157,7 @@ public class QHybridCoordinator extends AbstractDeviceCoordinator {
@Override
public boolean supportsWeather() {
return false;
return isHybridHR();
}
@Override
@ -188,5 +178,24 @@ public class QHybridCoordinator extends AbstractDeviceCoordinator {
}
@Override
public int[] getSupportedDeviceSpecificSettings(GBDevice device) {
if (isHybridHR()) {
return new int[]{
R.xml.devicesettings_fossilhybridhr,
R.xml.devicesettings_pairingkey
};
}
return new int[]{
R.xml.devicesettings_pairingkey
};
}
private boolean isHybridHR() {
GBDevice connectedDevice = GBApplication.app().getDeviceManager().getSelectedDevice();
if (connectedDevice != null) {
return connectedDevice.getName().startsWith("Hybrid HR");
}
return false;
}
}

View File

@ -1,32 +1,26 @@
package nodomain.freeyourgadget.gadgetbridge.devices.qhybrid;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import java.util.List;
import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.Widget;
import nodomain.freeyourgadget.gadgetbridge.activities.AbstractGBActivity;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.widget.CustomBackgroundWidgetElement;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.widget.CustomTextWidgetElement;
@ -56,7 +50,7 @@ public class WidgetSettingsActivity extends AbstractGBActivity {
((EditText) findViewById(R.id.qhybrid_widget_name)).setText(subject.getName());
resultCode = RESULT_CODE_WIDGET_UPDATED;
}else{
subject = new CustomWidget("", 0, 63);
subject = new CustomWidget("", 0, 63, "default"); // FIXME: handle force white background
resultCode = RESULT_CODE_WIDGET_CREATED;
findViewById(R.id.qhybrid_widget_delete).setEnabled(false);
}

View File

@ -40,11 +40,11 @@ public class DailyTotals {
private static final Logger LOG = LoggerFactory.getLogger(DailyTotals.class);
public int[] getDailyTotalsForAllDevices(Calendar day) {
public long[] getDailyTotalsForAllDevices(Calendar day) {
Context context = GBApplication.getContext();
//get today's steps for all devices in GB
int all_steps = 0;
int all_sleep = 0;
long all_steps = 0;
long all_sleep = 0;
if (context instanceof GBApplication) {
@ -55,18 +55,18 @@ public class DailyTotals {
if (!coordinator.supportsActivityDataFetching()) {
continue;
}
int[] all_daily = getDailyTotalsForDevice(device, day);
long[] all_daily = getDailyTotalsForDevice(device, day);
all_steps += all_daily[0];
all_sleep += all_daily[1] + all_daily[2];
}
}
LOG.debug("gbwidget daily totals, all steps:" + all_steps);
LOG.debug("gbwidget daily totals, all sleep:" + all_sleep);
return new int[]{all_steps, all_sleep};
return new long[]{all_steps, all_sleep};
}
public int[] getDailyTotalsForDevice(GBDevice device, Calendar day) {
public long[] getDailyTotalsForDevice(GBDevice device, Calendar day) {
try (DBHandler handler = GBApplication.acquireDB()) {
ActivityAnalysis analysis = new ActivityAnalysis();
@ -76,19 +76,19 @@ public class DailyTotals {
amountsSteps = analysis.calculateActivityAmounts(getSamplesOfDay(handler, day, 0, device));
amountsSleep = analysis.calculateActivityAmounts(getSamplesOfDay(handler, day, -12, device));
int[] Sleep = getTotalsSleepForActivityAmounts(amountsSleep);
int Steps = getTotalsStepsForActivityAmounts(amountsSteps);
long[] sleep = getTotalsSleepForActivityAmounts(amountsSleep);
long steps = getTotalsStepsForActivityAmounts(amountsSteps);
return new int[]{Steps, Sleep[0], Sleep[1]};
return new long[]{steps, sleep[0], sleep[1]};
} catch (Exception e) {
GB.toast("Error loading activity summaries.", Toast.LENGTH_SHORT, GB.ERROR, e);
return new int[]{0, 0, 0};
return new long[]{0, 0, 0};
}
}
private int[] getTotalsSleepForActivityAmounts(ActivityAmounts activityAmounts) {
private long[] getTotalsSleepForActivityAmounts(ActivityAmounts activityAmounts) {
long totalSecondsDeepSleep = 0;
long totalSecondsLightSleep = 0;
for (ActivityAmount amount : activityAmounts.getAmounts()) {
@ -98,14 +98,14 @@ public class DailyTotals {
totalSecondsLightSleep += amount.getTotalSeconds();
}
}
int totalMinutesDeepSleep = (int) (totalSecondsDeepSleep / 60);
int totalMinutesLightSleep = (int) (totalSecondsLightSleep / 60);
return new int[]{totalMinutesDeepSleep, totalMinutesLightSleep};
long totalMinutesDeepSleep = (totalSecondsDeepSleep / 60);
long totalMinutesLightSleep = (totalSecondsLightSleep / 60);
return new long[]{totalMinutesDeepSleep, totalMinutesLightSleep};
}
private int getTotalsStepsForActivityAmounts(ActivityAmounts activityAmounts) {
int totalSteps = 0;
private long getTotalsStepsForActivityAmounts(ActivityAmounts activityAmounts) {
long totalSteps = 0;
for (ActivityAmount amount : activityAmounts.getAmounts()) {
totalSteps += amount.getTotalSteps();

View File

@ -30,11 +30,11 @@ import nodomain.freeyourgadget.gadgetbridge.service.serial.GBDeviceIoThread;
public class CasioHandlerThread extends GBDeviceIoThread {
private static final Logger LOG = LoggerFactory.getLogger(CasioHandlerThread.class);
private static final int TX_PERIOD = 60;
private boolean mQuit = false;
private CasioGB6900DeviceSupport mDeviceSupport;
private final Object waitObject = new Object();
private int TX_PERIOD = 60;
private Calendar mTxTime = GregorianCalendar.getInstance();

View File

@ -137,6 +137,7 @@ 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_SYNC_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;
@ -737,7 +738,13 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
TransactionBuilder builder = performInitialized("Set date and time");
setCurrentTimeWithService(builder);
//TODO: once we have a common strategy for sending events (e.g. EventHandler), remove this call from here. Meanwhile it does no harm.
sendCalendarEvents(builder);
// = we should genaralize the pebble calender code
if (characteristicChunked == null) { // all except Mi Band 2
sendCalendarEvents(builder);
}
else {
sendCalendarEventsAsReminder(builder);
}
builder.queue(getQueue());
} catch (IOException ex) {
LOG.error("Unable to set time on Huami device", ex);
@ -818,7 +825,6 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
}
private void sendMusicStateToDevice() {
if (characteristicChunked == null) {
return;
@ -1323,8 +1329,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
if ((currentButtonPressTime == 0) || (timeSinceLastPress < buttonPressMaxDelay)) {
currentButtonPressCount++;
}
else {
} else {
currentButtonPressCount = 1;
currentButtonActionId = 0;
}
@ -1352,8 +1357,6 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
}
@Override
public boolean onCharacteristicChanged(BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic) {
@ -1498,12 +1501,17 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
private void decodeAndUpdateAlarmStatus(byte[] response) {
List<nodomain.freeyourgadget.gadgetbridge.entities.Alarm> alarms = DBHelper.getAlarms(gbDevice);
boolean[] alarmsInUse = new boolean[10];
boolean[] alarmsEnabled = new boolean[10];
int maxAlarms = 10;
boolean[] alarmsInUse = new boolean[maxAlarms];
boolean[] alarmsEnabled = new boolean[maxAlarms];
int nr_alarms = response[8];
for (int i = 0; i < nr_alarms; i++) {
byte alarm_data = response[9 + i];
int index = alarm_data & 0xf;
if (index >= maxAlarms) {
GB.toast("Unexpected alarm index from device, ignoring: " + index, Toast.LENGTH_SHORT, GB.ERROR);
return;
}
alarmsInUse[index] = true;
boolean enabled = (alarm_data & 0x10) == 0x10;
alarmsEnabled[index] = enabled;
@ -1703,6 +1711,49 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
return this;
}
private HuamiSupport sendCalendarEventsAsReminder(TransactionBuilder builder) {
boolean syncCalendar = GBApplication.getDeviceSpecificSharedPrefs(gbDevice.getAddress()).getBoolean(PREF_SYNC_CALENDAR, false);
if (!syncCalendar) {
return this;
}
CalendarEvents upcomingEvents = new CalendarEvents();
List<CalendarEvents.CalendarEvent> calendarEvents = upcomingEvents.getCalendarEventList(getContext());
Calendar calendar = Calendar.getInstance();
int iteration = 0;
for (CalendarEvents.CalendarEvent calendarEvent : calendarEvents) {
if (iteration > 8) { // limit ?
break;
}
calendar.setTimeInMillis(calendarEvent.getBegin());
byte[] title = calendarEvent.getTitle().getBytes();
byte[] body = calendarEvent.getDescription().getBytes();
int length = 18 + title.length + 1 + body.length + 1;
ByteBuffer buf = ByteBuffer.allocate(length);
buf.order(ByteOrder.LITTLE_ENDIAN);
buf.put((byte) 0x0b); // always 0x0b?
buf.put((byte) iteration); // îd
buf.putInt(0x08 | 0x04 | 0x01); // flags 0x01 = enable, 0x04 = end date present, 0x08 = has text
calendar.setTimeInMillis(calendarEvent.getBegin());
buf.put(BLETypeConversions.shortCalendarToRawBytes(calendar));
calendar.setTimeInMillis(calendarEvent.getEnd());
buf.put(BLETypeConversions.shortCalendarToRawBytes(calendar));
buf.put(title);
buf.put((byte) 0); // 0 Terminated
buf.put(body);
buf.put((byte) 0); // 0 Terminated
writeToChunked(builder, 2, buf.array());
iteration++;
}
return this;
}
@Override
public void onSendConfiguration(String config) {
TransactionBuilder builder;

View File

@ -45,8 +45,8 @@ import java.util.HashMap;
import java.util.Iterator;
import java.util.UUID;
import nodomain.freeyourgadget.gadgetbridge.BuildConfig;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.GBException;
import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventBatteryInfo;
import nodomain.freeyourgadget.gadgetbridge.devices.qhybrid.NotificationConfiguration;
@ -61,6 +61,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.MusicSpec;
import nodomain.freeyourgadget.gadgetbridge.model.MusicStateSpec;
import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
import nodomain.freeyourgadget.gadgetbridge.model.RecordedDataTypes;
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
import nodomain.freeyourgadget.gadgetbridge.service.btle.GattService;
import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder;
import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.SetDeviceStateAction;
@ -115,7 +116,7 @@ public class QHybridSupport extends QHybridBaseSupport {
private PackageConfigHelper helper;
private volatile boolean searchDevice = false;
public volatile boolean searchDevice = false;
private long timeOffset;
@ -511,35 +512,12 @@ public class QHybridSupport extends QHybridBaseSupport {
@Override
public void onFindDevice(boolean start) {
try {
if (watchAdapter.supportsExtendedVibration()) {
GB.toast("Device does not support brr brr", Toast.LENGTH_SHORT, GB.INFO);
}
} catch (UnsupportedOperationException e) {
notifiyException(e);
GB.toast("Please contact dakhnod@gmail.com\n", Toast.LENGTH_SHORT, GB.INFO);
}
watchAdapter.onFindDevice(start);
}
if (start && searchDevice) return;
searchDevice = start;
if (start) {
new Thread(new Runnable() {
@Override
public void run() {
int i = 0;
while (searchDevice) {
QHybridSupport.this.watchAdapter.vibrateFindMyDevicePattern();
try {
Thread.sleep(2500);
} catch (InterruptedException e) {
GB.log("error", GB.ERROR, e);
}
}
}
}).start();
}
@Override
public void onSendWeather(WeatherSpec weatherSpec) {
watchAdapter.onSendWeather(weatherSpec);
}
@Override
@ -583,7 +561,13 @@ public class QHybridSupport extends QHybridBaseSupport {
notifiyException("", e);
}
public void notifiyException(String requestName, Exception e){
public void notifiyException(String requestName, Exception e) {
if (!BuildConfig.DEBUG) {
logger.error("Error: " + requestName, e);
return;
}
GB.toast("Please contact dakhnod@gmail.com\n", Toast.LENGTH_SHORT, GB.ERROR, e);
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
@ -616,7 +600,6 @@ public class QHybridSupport extends QHybridBaseSupport {
}
((NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE)).notify((int) System.currentTimeMillis(), notificationBuilder.build());
}
@Override
@ -646,7 +629,6 @@ public class QHybridSupport extends QHybridBaseSupport {
gbDevice.addDeviceInfo(new GenericItem(ITEM_HAS_ACTIVITY_HAND, String.valueOf(watchAdapter.supportsActivityHand())));
} catch (UnsupportedOperationException e) {
notifiyException(e);
GB.toast("Please contact dakhnod@gmail.com\n", Toast.LENGTH_SHORT, GB.INFO);
gbDevice.addDeviceInfo(new GenericItem(ITEM_EXTENDED_VIBRATION_SUPPORT, "false"));
}
break;

View File

@ -27,6 +27,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.Alarm;
import nodomain.freeyourgadget.gadgetbridge.model.CallSpec;
import nodomain.freeyourgadget.gadgetbridge.model.MusicSpec;
import nodomain.freeyourgadget.gadgetbridge.model.MusicStateSpec;
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.QHybridSupport;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.PlayNotificationRequest;
@ -121,4 +122,10 @@ public abstract class WatchAdapter {
public void onSetCallState(CallSpec callSpec) {
}
public void onFindDevice(boolean start) {
}
public void onSendWeather(WeatherSpec weatherSpec) {
}
}

View File

@ -35,7 +35,6 @@ import java.util.GregorianCalendar;
import java.util.TimeZone;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.GBException;
import nodomain.freeyourgadget.gadgetbridge.devices.qhybrid.NotificationConfiguration;
import nodomain.freeyourgadget.gadgetbridge.devices.qhybrid.PackageConfigHelper;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
@ -54,9 +53,7 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fos
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.configuration.ConfigurationPutRequest;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.file.FilePutRequest;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.notification.NotificationFilterPutRequest;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.notification.PlayNotificationRequest;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.notification.PlayTextNotificationRequest;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.authentication.VerifyPrivateKeyRequest;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.AnimationRequest;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.MoveHandsRequest;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.ReleaseHandsControlRequest;
@ -516,6 +513,38 @@ public class FossilWatchAdapter extends WatchAdapter {
public void handleHeartRateCharacteristic(BluetoothGattCharacteristic characteristic) {
}
@Override
public void onFindDevice(boolean start) {
try {
if (this.supportsExtendedVibration()) {
GB.toast("Device does not support brr brr", Toast.LENGTH_SHORT, GB.INFO);
}
} catch (UnsupportedOperationException e) {
getDeviceSupport().notifiyException(e);
}
if (start && getDeviceSupport().searchDevice) return;
getDeviceSupport().searchDevice = start;
if (start) {
new Thread(new Runnable() {
@Override
public void run() {
int i = 0;
while (getDeviceSupport().searchDevice) {
vibrateFindMyDevicePattern();
try {
Thread.sleep(2500);
} catch (InterruptedException e) {
GB.log("error", GB.ERROR, e);
}
}
}
}).start();
}
}
protected void handleBackgroundCharacteristic(BluetoothGattCharacteristic characteristic) {
byte[] value = characteristic.getValue();
switch (value[1]) {

View File

@ -24,14 +24,17 @@ import java.io.File;
import java.io.IOException;
import java.nio.BufferOverflowException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.TimeZone;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.UUID;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventCallControl;
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventFindPhone;
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventMusicControl;
import nodomain.freeyourgadget.gadgetbridge.devices.qhybrid.HRConfigActivity;
@ -41,13 +44,15 @@ import nodomain.freeyourgadget.gadgetbridge.model.CallSpec;
import nodomain.freeyourgadget.gadgetbridge.model.MusicSpec;
import nodomain.freeyourgadget.gadgetbridge.model.MusicStateSpec;
import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
import nodomain.freeyourgadget.gadgetbridge.model.Weather;
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.QHybridSupport;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.adapter.fossil.FossilWatchAdapter;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.RequestMtuRequest;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.SetDeviceStateRequest;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.configuration.ConfigurationPutRequest.TimeConfigItem;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.notification.PlayCallNotificationRequest;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.notification.PlayNotificationRequest;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.notification.PlayTextNotificationRequest;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.authentication.VerifyPrivateKeyRequest;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.buttons.ButtonConfigurationPutRequest;
@ -69,6 +74,7 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fos
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.widget.Widget;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.widget.WidgetsPutRequest;
import nodomain.freeyourgadget.gadgetbridge.util.GB;
import nodomain.freeyourgadget.gadgetbridge.util.Prefs;
import nodomain.freeyourgadget.gadgetbridge.util.StringUtils;
import static nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil_hr.music.MusicControlRequest.MUSIC_PHONE_REQUEST;
@ -78,9 +84,9 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter {
private byte[] phoneRandomNumber;
private byte[] watchRandomNumber;
ArrayList<Widget> widgets = new ArrayList<>();
private ArrayList<Widget> widgets = new ArrayList<>();
NotificationHRConfiguration[] notificationConfigurations;
private NotificationHRConfiguration[] notificationConfigurations;
private MusicSpec currentSpec = null;
@ -105,46 +111,8 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter {
queueWrite(new SetDeviceStateRequest(GBDevice.State.INITIALIZING));
// icons
loadNotificationConfigurations();
queueWrite(new NotificationFilterPutHRRequest(this.notificationConfigurations, this));
// queueWrite(new NotificationFilterPutHRRequest(this.notificationConfigurations,this));
/*try {
final String[] appNames = {"instagram", "snapchat", "line", "whatsapp"};
final String[] paths = {
"/storage/emulated/0/Q/images/icInstagram.icon",
"/storage/emulated/0/Q/images/icSnapchat.icon",
"/storage/emulated/0/Q/images/icLine.icon",
"/storage/emulated/0/Q/images/icWhatsapp.icon"
};
NotificationHRConfiguration[] configs = new NotificationHRConfiguration[4];
NotificationImage[] images = new NotificationImage[4];
for(int i = 0; i < 4; i++){
FileInputStream fis = new FileInputStream(paths[i]);
byte[] imageData = new byte[fis.available()];
fis.read(imageData);
fis.close();
configs[i] = new NotificationHRConfiguration(appNames[i], i);
images[i] = new NotificationImage(appNames[i], imageData);
}
queueWrite(new NotificationImagePutRequest(images, this));
queueWrite(new NotificationFilterPutHRRequest(configs, this));
for(String appName : appNames){
queueWrite(new PlayNotificationHRRequest(
appName,
appName.toUpperCase(),
"this is some strange message",
this
));
}
} catch (Exception e) {
e.printStackTrace();
}*/
setVibrationStrength((short) 75);
syncSettings();
@ -171,22 +139,34 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter {
private void loadNotificationConfigurations(){
this.notificationConfigurations = new NotificationHRConfiguration[]{
new NotificationHRConfiguration("generic", 0),
new NotificationHRConfiguration("call", new byte[]{(byte)0x80, (byte) 0x00, (byte) 0x59, (byte) 0xB7}, 0)
};
}
private void loadBackground(){
/*Bitmap backgroundBitmap = BitmapFactory
.decodeFile("/sdcard/DCIM/Camera/IMG_20191129_200726.jpg");
Prefs prefs = new Prefs(GBApplication.getDeviceSpecificSharedPrefs(getDeviceSupport().getDevice().getAddress()));
boolean forceWhiteBackground = prefs.getBoolean("force_white_color_scheme", false);
if (forceWhiteBackground) {
byte[] whiteGIF = new byte[]{
0x47, 0x49, 0x46, 0x38, 0x37, 0x61, 0x01, 0x00, 0x01, 0x00, (byte) 0x80, 0x01, 0x00, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x02, 0x02, 0x44, 0x01, 0x00, 0x3B
};
try {
this.backGroundImage = AssetImageFactory.createAssetImage(backgroundBitmap, false, 0,:wq
0, 0);
} catch (IOException e) {
GB.log("Backgroundimage error", GB.ERROR, e);
}*/
Bitmap backgroundBitmap = BitmapFactory.decodeByteArray(whiteGIF, 0, whiteGIF.length);
//Bitmap backgroundBitmap = BitmapFactory.decodeFile("/sdcard/DCIM/Camera/IMG_20191129_200726.jpg");
try {
this.backGroundImage = AssetImageFactory.createAssetImage(backgroundBitmap, false, 0, 0, 0);
} catch (IOException e) {
logger.error("Backgroundimage error", e);
}
}
}
private void loadWidgets() {
Prefs prefs = new Prefs(GBApplication.getDeviceSpecificSharedPrefs(getDeviceSupport().getDevice().getAddress()));
boolean forceWhiteBackground = prefs.getBoolean("force_white_color_scheme", false);
String fontColor = forceWhiteBackground ? "black" : "default";
this.widgets.clear();
String widgetJson = GBApplication.getPrefs().getPreferences().getString("FOSSIL_HR_WIDGETS", "{}");
String customWidgetJson = GBApplication.getPrefs().getString("QHYBRID_CUSTOM_WIDGETS", "[]");
@ -209,7 +189,7 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter {
Widget widget = null;
if(type != null) {
widget = new Widget(type, positionMap.get(position), 63);
widget = new Widget(type, positionMap.get(position), 63, fontColor);
}else{
identifier = identifier.substring(7);
for(int i = 0; i < customWidgets.length(); i++){
@ -218,7 +198,8 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter {
CustomWidget newWidget = new CustomWidget(
customWidget.getString("name"),
positionMap.get(position),
63
63,
fontColor
);
JSONArray elements = customWidget.getJSONArray("elements");
@ -263,6 +244,8 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter {
}
private void renderWidgets() {
Prefs prefs = new Prefs(GBApplication.getDeviceSpecificSharedPrefs(getDeviceSupport().getDevice().getAddress()));
boolean forceWhiteBackground = prefs.getBoolean("force_white_color_scheme", false);
try {
ArrayList<AssetImage> widgetImages = new ArrayList<>();
@ -284,12 +267,12 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter {
Paint circlePaint = new Paint();
if(!backgroundDrawn){
circlePaint.setColor(Color.BLACK);
circlePaint.setColor(forceWhiteBackground ? Color.WHITE : Color.BLACK);
circlePaint.setStyle(Paint.Style.FILL);
circlePaint.setStrokeWidth(3);
widgetCanvas.drawCircle(38, 38, 37, circlePaint);
circlePaint.setColor(Color.WHITE);
circlePaint.setColor(forceWhiteBackground ? Color.BLACK : Color.WHITE);
circlePaint.setStyle(Paint.Style.STROKE);
circlePaint.setStrokeWidth(3);
widgetCanvas.drawCircle(38, 38, 37, circlePaint);
@ -326,7 +309,7 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter {
textPaint.setStrokeWidth(4);
textPaint.setTextSize(17f);
textPaint.setStyle(Paint.Style.FILL);
textPaint.setColor(Color.WHITE);
textPaint.setColor(forceWhiteBackground ? Color.BLACK : Color.WHITE);
textPaint.setTextAlign(Paint.Align.CENTER);
widgetCanvas.drawText(element.getValue(), element.getX(), element.getY() - (textPaint.descent() + textPaint.ascent()) / 2f, textPaint);
@ -504,11 +487,186 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter {
}
@Override
public void onSetCallState(CallSpec callSpec) {
super.onSetCallState(callSpec);
queueWrite(new PlayCallNotificationRequest(callSpec.number, callSpec.command == CallSpec.CALL_INCOMING, this));
public void onFindDevice(boolean start) {
if(start){
new TransactionBuilder("vibrate find")
.write(
getDeviceSupport().getCharacteristic(UUID.fromString("3dda0005-957f-7d4a-34a6-74696673696d")),
new byte[]{(byte) 0x01, (byte) 0x04, (byte) 0x30, (byte) 0x75, (byte) 0x00, (byte) 0x00}
)
.queue(getDeviceSupport().getQueue());
}else{
new TransactionBuilder("vibrate find")
.write(
getDeviceSupport().getCharacteristic(UUID.fromString("3dda0005-957f-7d4a-34a6-74696673696d")),
new byte[]{(byte) 0x02, (byte) 0x05, (byte) 0x04}
)
.queue(getDeviceSupport().getQueue());
}
}
@Override
public void onSetCallState(CallSpec callSpec) {
super.onSetCallState(callSpec);
queueWrite(new PlayCallNotificationRequest(StringUtils.getFirstOf(callSpec.name, callSpec.number), callSpec.command == CallSpec.CALL_INCOMING, this));
}
// this method is based on the one from AppMessageHandlerYWeather.java
private int getIconForConditionCode(int conditionCode, boolean isNight) {
final int CLEAR_DAY = 0;
final int CLEAR_NIGHT = 1;
final int CLOUDY = 2;
final int PARTLY_CLOUDY_DAY = 3;
final int PARTLY_CLOUDY_NIGHT = 4;
final int RAIN = 5;
final int SNOW = 6;
final int SNOW_2 = 7; // same as 6?
final int THUNDERSTORM = 8;
final int CLOUDY_2 = 9; // same as 2?
final int WINDY = 10;
if (conditionCode == 800 || conditionCode == 951) {
return isNight ? CLEAR_NIGHT : CLEAR_DAY;
} else if (conditionCode > 800 && conditionCode < 900) {
return isNight ? PARTLY_CLOUDY_NIGHT : PARTLY_CLOUDY_DAY;
} else if (conditionCode >= 300 && conditionCode < 400) {
return RAIN; // drizzle mapped to rain
} else if (conditionCode >= 500 && conditionCode < 600) {
return RAIN;
} else if (conditionCode >= 700 && conditionCode < 732) {
return CLOUDY;
} else if (conditionCode == 741 || conditionCode == 751 || conditionCode == 761 || conditionCode == 762) {
return CLOUDY; // fog mapped to cloudy
} else if (conditionCode == 771) {
return CLOUDY; // squalls mapped to cloudy
} else if (conditionCode == 781) {
return WINDY; // tornato mapped to windy
} else if (conditionCode >= 200 && conditionCode < 300) {
return THUNDERSTORM;
} else if (conditionCode >= 600 && conditionCode <= 602) {
return SNOW;
} else if (conditionCode >= 611 && conditionCode <= 622) {
return RAIN;
} else if (conditionCode == 906) {
return RAIN; // hail mapped to rain
} else if (conditionCode >= 907 && conditionCode < 957) {
return WINDY;
} else if (conditionCode == 905) {
return WINDY;
} else if (conditionCode == 900) {
return WINDY;
} else if (conditionCode == 901 || conditionCode == 902 || conditionCode == 962) {
return WINDY;
}
return isNight ? CLEAR_NIGHT : CLEAR_DAY;
}
@Override
public void onSendWeather(WeatherSpec weatherSpec) {
long ts = System.currentTimeMillis();
ts /= 1000;
try {
JSONObject responseObject = new JSONObject()
.put("res", new JSONObject()
.put("id", 0) // seems the id does not matter?
.put("set", new JSONObject()
.put("weatherInfo", new JSONObject()
.put("alive", ts + 60 * 60)
.put("unit", "c") // FIXME: do not hardcode
.put("temp", weatherSpec.currentTemp - 273)
.put("cond_id", getIconForConditionCode(weatherSpec.currentConditionCode, false)) // FIXME do not assume daylight
)
)
);
queueWrite(new JsonPutRequest(responseObject, this));
JSONArray forecastWeekArray = new JSONArray();
final String[] weekdays = {"", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(weatherSpec.timestamp * 1000L);
int i = 0;
for (WeatherSpec.Forecast forecast : weatherSpec.forecasts) {
cal.add(Calendar.DATE, 1);
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
forecastWeekArray.put(new JSONObject()
.put("day", weekdays[dayOfWeek])
.put("cond_id", getIconForConditionCode(forecast.conditionCode, false)) // FIXME do not assume daylight
.put("high", forecast.maxTemp - 273)
.put("low", forecast.minTemp - 273)
);
if (++i == 3) break; // max 3
}
JSONArray forecastDayArray = new JSONArray();
final int[] hours = {0, 0, 0};
for (int hour : hours) {
forecastDayArray.put(new JSONObject()
.put("hour", hour)
.put("cond_id", 0)
.put("temp", 0)
);
}
JSONObject forecastResponseObject = new JSONObject()
.put("res", new JSONObject()
.put("id", 0)
.put("set", new JSONObject()
.put("weatherApp._.config.locations", new JSONArray()
.put(new JSONObject()
.put("alive", ts + 60 * 60)
.put("city", weatherSpec.location)
.put("unit", "c") // FIXME: do not hardcode
.put("temp", weatherSpec.currentTemp - 273)
.put("high", weatherSpec.todayMaxTemp - 273)
.put("low", weatherSpec.todayMinTemp - 273)
.put("rain", 0)
.put("cond_id", getIconForConditionCode(weatherSpec.currentConditionCode, false)) // FIXME do not assume daylight
.put("forecast_day", forecastDayArray)
.put("forecast_week", forecastWeekArray)
)
)
)
);
queueWrite(new JsonPutRequest(forecastResponseObject, this));
} catch (JSONException e) {
logger.error("JSON exception: ", e);
}
}
// this was used to enumerate the weather icons :)
/*
static int i = 0;
@Override
public void onTestNewFunction() {
long ts = System.currentTimeMillis();
ts /= 1000;
try {
JSONObject responseObject = new JSONObject()
.put("res", new JSONObject()
.put("id", 0) // seems the id does not matter?
.put("set", new JSONObject()
.put("weatherInfo", new JSONObject()
.put("alive", ts + 60 * 60)
.put("unit", "c")
.put("temp", i)
.put("cond_id", i++)
)
));
queueWrite(new JsonPutRequest(responseObject, this));
} catch (JSONException e) {
logger.error(" JSON exception: ", e);
}
}
*/
public byte[] getSecretKey() {
byte[] authKeyBytes = new byte[16];
@ -579,7 +737,9 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter {
byte requestType = value[1];
if (requestType == (byte) 0x05) {
if(requestType == (byte) 0x04){
handleCallRequest(value);
}else if (requestType == (byte) 0x05) {
handleMusicRequest(value);
} else if (requestType == (byte) 0x01) {
int eventId = value[2];
@ -589,10 +749,11 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter {
logger.info(jsonString);
JSONObject requestJson = new JSONObject(jsonString);
int requestId = requestJson.getJSONObject("req").getInt("id");
JSONObject request = requestJson.getJSONObject("req");
int requestId = request.getInt("id");
if (requestJson.getJSONObject("req").has("ringMyPhone")) {
String action = requestJson.getJSONObject("req").getJSONObject("ringMyPhone").getString("action");
if (request.has("ringMyPhone")) {
String action = request.getJSONObject("ringMyPhone").getString("action");
logger.info("got ringMyPhone request; " + action);
GBDeviceEventFindPhone findPhoneEvent = new GBDeviceEventFindPhone();
@ -624,11 +785,19 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter {
.put("result", "off");
queueWrite(new JsonPutRequest(responseObject, this));
}
} else {
String action = requestJson.getJSONObject("req").getJSONObject("commuteApp._.config.commute_info")
} else if (request.has("weatherInfo") || request.has("weatherApp._.config.locations")) {
logger.info("Got weatherInfo request");
WeatherSpec weatherSpec = Weather.getInstance().getWeatherSpec();
if (weatherSpec != null) {
onSendWeather(weatherSpec);
} else {
logger.info("no weather data available - ignoring request");
}
} else if (request.has("commuteApp._.config.commute_info")) {
String action = request.getJSONObject("commuteApp._.config.commute_info")
.getString("dest");
String startStop = requestJson.getJSONObject("req").getJSONObject("commuteApp._.config.commute_info")
String startStop = request.getJSONObject("commuteApp._.config.commute_info")
.getString("action");
if (startStop.equals("stop")) {
@ -641,6 +810,8 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter {
Intent menuIntent = new Intent(QHybridSupport.QHYBRID_EVENT_COMMUTE_MENU);
menuIntent.putExtra("EXTRA_ACTION", action);
getContext().sendBroadcast(menuIntent);
} else {
logger.warn("Unhandled request from watch: " + requestJson.toString());
}
} catch (JSONException e) {
e.printStackTrace();
@ -648,6 +819,16 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter {
}
}
private void handleCallRequest(byte[] value) {
boolean acceptCall = value[7] == (byte) 0x00;
queueWrite(new PlayCallNotificationRequest("", false, this));
GBDeviceEventCallControl callControlEvent = new GBDeviceEventCallControl();
callControlEvent.event = acceptCall ? GBDeviceEventCallControl.Event.START : GBDeviceEventCallControl.Event.REJECT;
getDeviceSupport().evaluateGBDeviceEvent(callControlEvent);
}
private void handleMusicRequest(byte[] value) {
byte command = value[3];
logger.info("got music command: " + command);

View File

@ -1,9 +1,14 @@
package nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.notification;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.adapter.fossil.FossilWatchAdapter;
public class PlayCallNotificationRequest extends PlayNotificationRequest {
public PlayCallNotificationRequest(String number, boolean callStart, FossilWatchAdapter adapter) {
super(callStart ? 1 : 7, callStart ? 8 : 2, "generic", number, "Incoming Call", adapter);
super(callStart ? 1 : 7, callStart ? 8 : 2,
ByteBuffer.wrap(new byte[]{(byte) 0x80, (byte) 0x00, (byte) 0x59, (byte) 0xB7}).order(ByteOrder.LITTLE_ENDIAN).getInt(),
number, "Incoming Call", adapter);
}
}

View File

@ -26,8 +26,6 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fos
import nodomain.freeyourgadget.gadgetbridge.util.StringUtils;
public abstract class PlayNotificationRequest extends FilePutRequest {
static int id = 0;
public PlayNotificationRequest(int notificationType, int flags, String packageName, FossilWatchAdapter adapter) {
super((short) 0x0900, createFile(notificationType, flags, packageName, packageName, packageName), adapter);
}
@ -36,6 +34,9 @@ public abstract class PlayNotificationRequest extends FilePutRequest {
super((short) 0x0900, createFile(notificationType, flags, packageName, sender, message), adapter);
}
public PlayNotificationRequest(int notificationType, int flags, int packageCRC, String sender, String message, FossilWatchAdapter adapter) {
super((short) 0x0900, createFile(notificationType, flags, "whatever", sender, message, packageCRC), adapter);
}
private static byte[] createFile(int notificationType, int flags, String packageName, String sender, String message){
CRC32 crc = new CRC32();
@ -73,7 +74,7 @@ public abstract class PlayNotificationRequest extends FilePutRequest {
mainBuffer.put((byte) senderBytes.length);
mainBuffer.put((byte) messageBytes.length);
mainBuffer.putInt(id++); // messageId
mainBuffer.putInt(0); // messageId
mainBuffer.putInt(packageCrc);
mainBuffer.put(titleBytes);
mainBuffer.put(senderBytes);

View File

@ -24,7 +24,7 @@ public class ButtonConfigurationPutRequest extends JsonPutRequest {
.put("commuteApp._.config.destinations", new JSONArray(menuItems))
.put("master._.config.buttons", new JSONArray()
.put(new JSONObject()
.put("name", "commuteApp")
.put("name", "weatherApp")
.put("button_evt", "top_short_press_release")
)
.put(new JSONObject()

View File

@ -3,7 +3,6 @@ package nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fo
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.zip.CRC32;
import nodomain.freeyourgadget.gadgetbridge.devices.qhybrid.NotificationHRConfiguration;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.adapter.fossil.FossilWatchAdapter;
@ -21,20 +20,16 @@ public class NotificationFilterPutHRRequest extends FilePutRequest {
}
private static byte[] createFile(NotificationHRConfiguration[] configs) {
ByteBuffer buffer = ByteBuffer.allocate(configs.length * 28);
int payloadLength = configs.length * 28;
ByteBuffer buffer = ByteBuffer.allocate(payloadLength);
buffer.order(ByteOrder.LITTLE_ENDIAN);
for (NotificationHRConfiguration config : configs) {
buffer.putShort((short) 28); //packet length
payloadLength = 26;
CRC32 crc = new CRC32();
crc.update(config.getPackageName().getBytes());
buffer.putShort((short) payloadLength); //packet length
byte[] crcBytes = ByteBuffer
.allocate(4)
.order(ByteOrder.LITTLE_ENDIAN)
.putInt((int) crc.getValue())
.array();
byte[] crcBytes = config.getPackageCrc();
// 6 bytes
buffer.put(PacketID.PACKAGE_NAME_CRC.id)
@ -44,7 +39,7 @@ public class NotificationFilterPutHRRequest extends FilePutRequest {
// 3 bytes
buffer.put(PacketID.GROUP_ID.id)
.put((byte) 1)
.put((byte) 2);
.put((byte) 0);
// 3 bytes
buffer.put(PacketID.PRIORITY.id)

View File

@ -10,8 +10,8 @@ public class CustomWidget extends Widget {
private int angle, distance;
private String name;
public CustomWidget(String name, int angle, int distance) {
super(null, angle, distance);
public CustomWidget(String name, int angle, int distance, String fontColor) {
super(null, angle, distance, fontColor);
this.angle = angle;
this.distance = distance;
this.name = name;

View File

@ -11,12 +11,14 @@ import nodomain.freeyourgadget.gadgetbridge.R;
public class Widget implements Serializable {
private WidgetType widgetType;
int angle, distance;
private int angle, distance;
private String fontColor;
public Widget(WidgetType type, int angle, int distance) {
public Widget(WidgetType type, int angle, int distance, String fontColor) {
this.widgetType = type;
this.angle = angle;
this.distance = distance;
this.fontColor = fontColor;
}
@NonNull
@ -39,7 +41,7 @@ public class Widget implements Serializable {
.put("data", new JSONObject())
.put("theme",
new JSONObject()
.put("font_color", "default")
.put("font_color", fontColor)
);
} catch (JSONException e) {
e.printStackTrace();
@ -56,6 +58,7 @@ public class Widget implements Serializable {
ACTIVE_MINUTES("activeMinutesSSE", R.string.hr_widget_active_minutes),
CALORIES("caloriesSSE", R.string.hr_widget_calories),
BATTERY("batterySSE", R.string.hr_widget_battery),
WEATHER("weatherSSE", R.string.hr_widget_weather),
NOTHING(null, R.string.hr_widget_nothing);
private String identifier;

View File

@ -19,8 +19,12 @@ package nodomain.freeyourgadget.gadgetbridge.service.receivers;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.telecom.TelecomManager;
import android.telephony.TelephonyManager;
import androidx.annotation.RequiresApi;
import com.android.internal.telephony.ITelephony;
import org.slf4j.Logger;
@ -28,35 +32,60 @@ import org.slf4j.LoggerFactory;
import java.lang.reflect.Method;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventCallControl;
public class GBCallControlReceiver extends BroadcastReceiver {
public static final String ACTION_CALLCONTROL = "nodomain.freeyourgadget.gadgetbridge.callcontrol";
private static final Logger LOG = LoggerFactory.getLogger(GBCallControlReceiver.class);
private Context mContext = GBApplication.getContext();
@Override
public void onReceive(Context context, Intent intent) {
GBDeviceEventCallControl.Event callCmd = GBDeviceEventCallControl.Event.values()[intent.getIntExtra("event", 0)];
switch (callCmd) {
case END:
case REJECT:
case START:
try {
TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
Class clazz = Class.forName(telephonyManager.getClass().getName());
Method method = clazz.getDeclaredMethod("getITelephony");
method.setAccessible(true);
ITelephony telephonyService = (ITelephony) method.invoke(telephonyManager);
if (callCmd == GBDeviceEventCallControl.Event.END || callCmd == GBDeviceEventCallControl.Event.REJECT) {
telephonyService.endCall();
} else {
telephonyService.answerRingingCall();
if (GBApplication.isRunningPieOrLater()) {
handleCallCmdTelecomManager(callCmd);
} else {
switch (callCmd) {
case END:
case REJECT:
case START:
try {
TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
Class clazz = Class.forName(telephonyManager.getClass().getName());
Method method = clazz.getDeclaredMethod("getITelephony");
method.setAccessible(true);
ITelephony telephonyService = (ITelephony) method.invoke(telephonyManager);
if (callCmd == GBDeviceEventCallControl.Event.END || callCmd == GBDeviceEventCallControl.Event.REJECT) {
telephonyService.endCall();
} else {
telephonyService.answerRingingCall();
}
} catch (Exception e) {
LOG.warn("could not start or hangup call");
}
} catch (Exception e) {
LOG.warn("could not start or hangup call");
}
break;
default:
break;
default:
}
}
}
@RequiresApi(api = Build.VERSION_CODES.P)
public void handleCallCmdTelecomManager(GBDeviceEventCallControl.Event callCmd) {
try {
TelecomManager tm = (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE);
if (callCmd == GBDeviceEventCallControl.Event.END || callCmd == GBDeviceEventCallControl.Event.REJECT) {
tm.endCall();
} else if (callCmd == GBDeviceEventCallControl.Event.START || callCmd == GBDeviceEventCallControl.Event.ACCEPT) {
tm.acceptRingingCall();
}
} catch (SecurityException e) {
LOG.warn("no permission to start or hangup call");
} catch (Exception e) {
LOG.warn("could not start or hangup call");
}
}
}

View File

@ -47,8 +47,8 @@
android:id="@+id/alarm_time_picker"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scaleX="0.7"
android:scaleY="0.7"
android:scaleX="1"
android:scaleY="1"
android:layout_marginBottom="20dp" />
<LinearLayout

View File

@ -792,4 +792,5 @@
<string name="activity_error_no_app_for_gpx">Per a veure la traça d\'activitat, instal·leu una app que pugui manejar fitxers GPX.</string>
<string name="prefs_find_phone_summary">Fes servir la teva banda per a reproduir el to del telèfon.</string>
<string name="discovery_need_to_enter_authkey">Aquest aparell requereix una clau d\'autenticació secreta, mantingueu premut sobre l\'aparell per a introduir-la. Consulteu la wiki.</string>
<string name="pref_summary_allow_high_mtu">Augmenta la velocitat de transferència, però pot ser que no funcioni en alguns aparells Android.</string>
</resources>

View File

@ -832,4 +832,6 @@
<string name="prefs_button_double_press_action_selection_title">Aktion bei 2 Tastendrücken</string>
<string name="prefs_button_triple_press_action_selection_title">Aktion bei 3 Tastendrücken</string>
<string name="pref_title_allow_high_mtu">Hohe MTU erlauben</string>
<string name="pref_summary_sync_calendar">Aktiviert Kalendererinnerungen, auch wenn die Verbindung getrennt ist</string>
<string name="pref_title_sync_caldendar">Kalenderereignisse synchronisieren</string>
</resources>

View File

@ -799,4 +799,7 @@
<string name="qhybrid_changes_delay_prompt">El cambio puede demorar varios segundos…</string>
<string name="qhybrid_offset_time_by">tiempo compensado por</string>
<string name="pref_summary_disable_new_ble_scanning">Marque esta opción si su dispositivo no es encontrado durante el descubrimiento</string>
<string name="pref_summary_allow_high_mtu">Incrementa la velocidad de transferencia, pero puede no trabajar en algunos dispositivos Android.</string>
<string name="pref_summary_sync_calendar">Habilita las alertas del calendario, incluso cuando se encuentre desconectado</string>
<string name="pref_title_sync_caldendar">Sincronizar eventos del calendario</string>
</resources>

View File

@ -415,9 +415,9 @@ Temps de sommeil préféré en heures</string>
<string name="mi2_prefs_button_actions">Actions du bouton</string>
<string name="mi2_prefs_button_actions_summary">Spécifier les actions par pression du bouton</string>
<string name="mi2_prefs_button_press_count">Nombre de pressions du bouton</string>
<string name="mi2_prefs_button_press_count_summary">Nombre de pressions pour envoyer message</string>
<string name="mi2_prefs_button_press_count_summary">Nombre d\'appuis sur le boutton pour envoyer lÉvènement 1. Appuyer de nouveau autant de fois créera l\'Évènement 2, etc.</string>
<string name="mi2_prefs_button_press_broadcast">Message à envoyer</string>
<string name="mi2_prefs_button_press_broadcast_summary">Envoyer message après nombre défini de pressions du bouton</string>
<string name="mi2_prefs_button_press_broadcast_summary">Message de diffusion envoyé avec l\'évènement. Le paramètre `button_id` est automatiquement ajouté à chaque message.</string>
<string name="mi2_prefs_button_action">Activer action du bouton</string>
<string name="mi2_prefs_button_action_summary">Activer action après nombre spécifié de pressions</string>
<string name="mi2_prefs_button_action_vibrate">Activer la vibration du bracelet</string>
@ -601,8 +601,8 @@ Temps de sommeil préféré en heures</string>
<string name="devicetype_roidmi3">Roidmi 3</string>
<string name="pref_title_contextual_arabic">Arabe contextuel</string>
<string name="pref_summary_contextual_arabic">A cocher pour activer le support \"Arabe contextuel\"</string>
<string name="debugactivity_really_factoryreset_title">Confirmer la réinitialisation usine \?</string>
<string name="debugactivity_really_factoryreset">Une réinitialisation d\'usine effacera toutes les données de l\'appareil connecté (si supporté). Les appareils Xiaomi/Huami modifient également l\'adresse MAC Bluetooth, de sorte qu\'ils apparaissent comme de nouveaux appareils dans Gadgetbrige.</string>
<string name="debugactivity_really_factoryreset_title">Confirmer la réinitialisation \?</string>
<string name="debugactivity_really_factoryreset">Une réinitialisation effacera toutes les données de l\'appareil connecté (si supporté). Les appareils Xiaomi/Huami modifient également l\'adresse MAC Bluetooth, de sorte qu\'ils apparaissent comme de nouveaux appareils dans Gadgetbridge.</string>
<string name="mi3_prefs_band_screen_unlock">Déverrouillage de l\'écran du Band</string>
<string name="activity_type_exercise">Activité physique</string>
<string name="devicetype_casiogb6900">Casio GB-6900</string>
@ -788,15 +788,32 @@ Temps de sommeil préféré en heures</string>
\n
\nÀ VOS RISQUES ET PÉRILS !</string>
<string name="devicetype_qhybrid">Fossil Q Hybrid</string>
<string name="preferences_qhybrid_settings">Paramètres du Q Hybrid</string>
<string name="preferences_qhybrid_settings">Paramètres hybrides Q</string>
<string name="watch_not_connected">Montre non connectée</string>
<string name="qhybrid_vibration_strength">Puissance de vibration :</string>
<string name="qhybrid_goal_in_steps">Objectif de pas</string>
<string name="qhybrid_time_shift">décalage horaire</string>
<string name="qhybrid_second_timezone_offset_relative_to_utc">décalage du deuxième fuseau horaire par rapport à UTC</string>
<string name="qhybrid_prompt_million_steps">Veuillez régler le compteur de pas à un million pour l\'activer.</string>
<string name="qhybrid_changes_delay_prompt">les changements peuvent prendre quelques secondes…</string>
<string name="pref_disable_new_ble_scanning">Désactiver le nouveau scan BLE</string>
<string name="qhybrid_changes_delay_prompt">le changement peut prendre quelques secondes…</string>
<string name="pref_disable_new_ble_scanning">Désactiver la nouvelle détection BLE</string>
<string name="pref_summary_disable_new_ble_scanning">Cochez cette option si votre appareil ne peut être découvert</string>
<string name="devicetype_banglejs">Bangle.js</string>
<string name="qhybrid_overwrite_buttons">modifier les boutons</string>
<string name="qhybrid_use_activity_hand_as_notification_counter">utilise l\'activité de la main comme compteur de notification</string>
<string name="qhybrid_buttons_overwrite_success">Boutons modifiés</string>
<string name="qhybrid_buttons_overwrite_error">Une erreur est survenue lors de la modification des boutons</string>
<string name="qhybrid_offset_timezone">décale le fuseau horaire de</string>
<string name="qhybrid_offset_time_by">décale l\'heure de</string>
<string name="devicetype_y5">Y5</string>
<string name="prefs_button_single_press_action_selection_title">Action de l\'évènement 1</string>
<string name="prefs_button_double_press_action_selection_title">Action de l\'évènement 2</string>
<string name="prefs_button_triple_press_action_selection_title">Action de l\'évènement 3</string>
<string name="prefs_button_variable_actions">Paramètres détaillés des appuis de bouton</string>
<string name="prefs_button_long_press_action_selection_title">Action d\'appui long de bouton</string>
<string name="alarm_snooze">Reporter</string>
<string name="error_no_location_access">L\'accès à la localisation doit être autorisé et activé pour permettre à la détection de fonctionner correctement</string>
<string name="devicetype_itag">iTag</string>
<string name="pref_title_allow_high_mtu">Autoriser une grande MTU</string>
<string name="pref_summary_allow_high_mtu">Augmente la vitesse de transfert, mais peut ne pas fonctionner avec quelques appareils Android.</string>
</resources>

View File

@ -825,4 +825,14 @@
<string name="devicetype_itag">iTag</string>
<string name="pref_title_allow_high_mtu">לאפשר MTU גבוה</string>
<string name="pref_summary_allow_high_mtu">מגביר את קצב ההעברה, יש מכשירי Android שלא תומכים בזה.</string>
<string name="pref_summary_sync_calendar">הפעלת התראות לוח שנה, אפילו ללא חיבור</string>
<string name="pref_title_sync_caldendar">סנכרון אירועי לוח שנה</string>
<string name="hr_widget_heart_rate">דופק</string>
<string name="hr_widget_steps">צעדים</string>
<string name="hr_widget_date">תאריך</string>
<string name="hr_widget_active_minutes">דקות פעילות</string>
<string name="hr_widget_calories">קלוריות</string>
<string name="hr_widget_battery">סוללה</string>
<string name="hr_widget_weather">מזג אוויר</string>
<string name="hr_widget_nothing">כלום</string>
</resources>

View File

@ -140,9 +140,9 @@
<string name="pref_title_pebble_reconnect_attempts">Tentativi di riconessione</string>
<!--HPlus Preferences-->
<string name="pref_title_unit_system">Unità</string>
<string name="pref_title_timeformat">Formato dell\'orario</string>
<string name="pref_title_timeformat">Formato orario</string>
<string name="pref_title_screentime">Durata dell\'accensione dello schermo</string>
<string name="prefs_title_all_day_heart_rate">Misura il battito cardiaco continuativamente</string>
<string name="prefs_title_all_day_heart_rate">Misurazione della frequenza cardiaca per tutto il giorno</string>
<string name="preferences_hplus_settings">Impostazioni HPlus/Makibes</string>
<string name="not_connected">Non connesso</string>
<string name="connecting">In collegamento</string>
@ -225,7 +225,7 @@
<string name="stats_y_axis_label">Passi al minuto</string>
<string name="control_center_find_lost_device">Trova dispositivo smarrito</string>
<string name="control_center_cancel_to_stop_vibration">Annulla per fermare la vibrazione.</string>
<string name="title_activity_charts">Le tue attività</string>
<string name="title_activity_charts">Attività e Sonno</string>
<string name="title_activity_set_alarm">Configurazione sveglia</string>
<string name="controlcenter_start_configure_alarms">Configurazione sveglia</string>
<string name="title_activity_alarm_details">Sveglia</string>
@ -253,11 +253,11 @@
<string name="notif_battery_low_percent">%1$s batteria rimanente: %2$s%%</string>
<string name="notif_battery_low_bigtext_last_charge_time">Ultima ricarica: %s \n</string>
<string name="notif_battery_low_bigtext_number_of_charges">Numero di ricariche: %s</string>
<string name="sleepchart_your_sleep">Il tuo sonno</string>
<string name="sleepchart_your_sleep">Sonno</string>
<string name="weeksleepchart_sleep_a_week">Sonno settimanale</string>
<string name="weeksleepchart_today_sleep_description">Sonno di oggi, obiettivo: %1$s</string>
<string name="weekstepschart_steps_a_week">Passi della settimana</string>
<string name="activity_sleepchart_activity_and_sleep">Attività e sonno</string>
<string name="activity_sleepchart_activity_and_sleep">Attività</string>
<string name="updating_firmware">Aggiornamento del Firmware…</string>
<string name="fwapp_install_device_not_ready">Il file non può essere installato, il dispositivo non è pronto.</string>
<string name="installhandler_firmware_name">%1$s: %2$s %3$s</string>
@ -381,6 +381,7 @@
<string name="timeformat_am_pm">AM/PM</string>
<string name="pref_screen_notification_profile_alarm_clock">Sveglia</string>
<string name="find_device_you_found_it">Trovato!</string>
<string name="find_lost_device_you_found_it">Trovato!</string>
<string name="miband2_prefs_timeformat">Mi2: Formato dell\'orario</string>
<string name="mi2_fw_installhandler_fw53_hint">E\' necessario installare la verione %1$s prima di installare questo firmware!</string>
<string name="mi2_enable_text_notifications">Notifiche</string>
@ -430,11 +431,11 @@
<string name="interval_one_hour">ogni ora</string>
<string name="notif_export_failed_title">Esportazione del database fallita! Per favore controlla le impostazioni.</string>
<string name="mi2_prefs_button_actions">Azioni tasto</string>
<string name="mi2_prefs_button_actions_summary">Specifica le azioni alla pressione del pulsante del Mi Band 2</string>
<string name="mi2_prefs_button_actions_summary">Specifica le azioni alla pressione del pulsante</string>
<string name="mi2_prefs_button_press_count">Conteggio pressione tasto</string>
<string name="mi2_prefs_button_press_count_summary">Numero di volte che il tasto deve essere premuto per inviare un messaggio in broadcast</string>
<string name="mi2_prefs_button_press_count_summary">Numero di volte che il tasto deve essere premuto per generare un Evento 1. Successivo medesimo numero di volte che il tasto deve essere premuto per un Evento 2 e così via.</string>
<string name="mi2_prefs_button_press_broadcast">Messaggio da inviare in broadcast</string>
<string name="mi2_prefs_button_press_broadcast_summary">Numero di pressioni del tasto per il messaggio in broadcast raggiunto</string>
<string name="mi2_prefs_button_press_broadcast_summary">Messaggio inviato con l\'evento. Il parametro `button_id` è aggiunto automaticamente al ogni messaggio.</string>
<string name="mi2_prefs_button_action">Abilita azioni tasto</string>
<string name="mi2_prefs_button_action_summary">Abilita azioni selezionando un numero specifico di pressioni del tasto</string>
<string name="mi2_prefs_button_action_vibrate">Abilita vibrazione band</string>
@ -484,7 +485,7 @@
<string name="notification_channel_name">Notifiche Gadgetbridge</string>
<string name="devicetype_xwatch">XWatch</string>
<string name="on">Acceso</string>
<string name="blacklist_all_for_notifications">Blocca le notifiche da tutte le applicazioni</string>
<string name="blacklist_all_for_notifications">Blocca tutte le notifiche</string>
<string name="whitelist_all_for_notifications">Consenti le notifiche da tutte le applicazioni</string>
<string name="fw_upgrade_notice_miband3">Si sta per installare il firmware %s sul Mi Band 3.
\n
@ -602,7 +603,7 @@
<string name="lack_of_step">Passi mancanti: %1$d</string>
<string name="overstep">Passi eccedenti: %1$d</string>
<string name="debugactivity_really_factoryreset_title">Vuoi ripristinare alle impostazioni di fabbrica\?</string>
<string name="debugactivity_really_factoryreset">Effettuare il ripristino delle impostazioni di fabbrica cancellerà tutti i dati presenti sul dispositivo connesso (se supportato). I dispositivi Xiaomi/Huami cambieranno anche il proprio MAC Address Bluetooth, in modo da risultare dispositivi nuovi per Gadgetbrige.</string>
<string name="debugactivity_really_factoryreset">Effettuare il ripristino delle impostazioni di fabbrica cancellerà tutti i dati presenti sul dispositivo connesso (se supportato). I dispositivi Xiaomi/Huami cambiano anche MAC Address Bluetooth, e in modo risultano dispositivi nuovi per Gadgetbrige.</string>
<string name="devicetype_casiogb6900">Casio GB-6900</string>
<string name="title_activity_notification_filter">Filtro Notifiche</string>
<string name="toast_app_must_not_be_blacklisted">L\'app non deve trovarsi nella blacklist per essere configurata</string>
@ -676,15 +677,15 @@
<string name="activity_prefs_activetime_minutes">Obiettivo giornaliero: tempo di attività in minuti</string>
<string name="devicetype_miscale2">Mi Scale 2</string>
<string name="devicetype_bfh16">BFH-16</string>
<string name="fw_upgrade_notice_amazfitcor2">Stai per installare il firmware %s sul tuo Amazfit Cor 2.
\n
\nAssicurati di installare il file .fw e successivamente il file .res. L\' Amazfit Cor 2 si riavvierà dopo aver installato il file .fw.
\n
\nNota: non è necessario installare .res se è esattamente lo stesso di quello precedentemente installato.
\n
\nPROCEDI A TUO RISCHIO!
\n
\nNON COMPLETAMENTE TESTATO, PROBABILMENTE DOVRAI FLASHARE IL FIRMWARE BEATS_W SE IL NOME DEL TUO DISPOSITIVO è \"Amazfit Band 2\"</string>
<string name="fw_upgrade_notice_amazfitcor2">Stai per installare il firmware %s sul tuo Amazfit Cor 2.
\n
\nAssicurati di installare il file .fw e successivamente il file .res. La band si riavvierà dopo aver installato il file .fw.
\n
\nNota: non è necessario installare .res se è esattamente lo stesso di quello installato in precedenza.
\n
\nPROCEDI A TUO RISCHIO!
\n
\nCOMPLETAMENTE NON TESTATO, PROBABILMENTE DOVRAI FLASHARE IL FIRMWARE BEATS_W SE IL NOME DEL TUO DISPOSITIVO è \"Amazfit Band 2\"</string>
<string name="dutch">Olandese</string>
<string name="turkish">Turco</string>
<string name="ukrainian">Ucraino</string>
@ -706,4 +707,73 @@
<string name="prefs_hr_alarm_low">Limite inferiore</string>
<string name="prefs_hr_alarm_high">Limite Superiore</string>
<string name="mi2_prefs_button_press_broadcast_default_value" translatable="false">nodomain.freeyourgadget.gadgetbridge.ButtonPressed</string>
<string name="pref_header_charts">Impostazioni dei grafici</string>
<string name="pref_title_charts_average">Mostra le medie nei grafici</string>
<string name="pref_title_charts_range">Intervallo dei grafici</string>
<string name="pref_charts_range_on">L\'intervallo dei grafici è impostato su di un mese</string>
<string name="pref_charts_range_off">L\'intervallo dei grafici è impostato su di una settimana</string>
<string name="weekstepschart_steps_a_month">Passi al mese</string>
<string name="weeksleepchart_sleep_a_month">Sonno per mese</string>
<string name="menuitem_nfc">NFC</string>
<string name="pref_summary_expose_hr">Consente ad altre applicazioni di accedere ai dati cardiaci in tempo reale mentre Gadgetbridge è collegato</string>
<string name="pref_title_expose_hr">Accesso ai dati cardiaci in tempo reale a terze parti</string>
<string name="pref_title_use_custom_font">Utilizza un font personalizzato</string>
<string name="pref_summary_use_custom_font">Abilita questa opzione se il tuo dispositivo ha un firmware dei caratteri personalizzato per il supporto emoji</string>
<string name="activity_db_management_autoexport_explanation">Il percorso di esportazione automatica del database è stato impostato su:</string>
<string name="activity_db_management_autoexport_label">Esportazione automatica</string>
<string name="activity_DB_ExportButton">Esporta DB</string>
<string name="activity_DB_import_button">Importa DB</string>
<string name="activity_DB_test_export_button">Esegui esportazione automatica ora</string>
<string name="activity_DB_test_export_message">Esportazione database in corso…</string>
<string name="activity_DB_delete_legacy_button">Elimina db precedente</string>
<string name="activity_DB_empty_button">DB vuoto</string>
<string name="activity_db_management_empty_DB">Database vuoto</string>
<string name="activity_db_management_exportimport_label">Esportazione e importazione</string>
<string name="activity_db_management_empty_db_warning">Attenzione! Premendo questo pulsante si cancella il database e si riparte da zero.</string>
<string name="widget_steps_label">Passi: %1$02d</string>
<string name="widget_sleep_label">Riposo:% 1 $ s</string>
<string name="widget_set_alarm_after">Imposta sveglia dopo:</string>
<string name="widget_5_minutes">5 minuti</string>
<string name="widget_10_minutes">10 minuti</string>
<string name="widget_20_minutes">20 minuti</string>
<string name="widget_1_hour">1 ora</string>
<string name="pref_display_add_device_fab_on">Sempre visibile</string>
<string name="pref_display_add_device_fab_off">Visibile solo se non viene aggiunto alcun dispositivo</string>
<string name="activity_error_no_app_for_gpx">Per visualizzare la traccia delle attività, installare un\'applicazione in grado di gestire i file GPX.</string>
<string name="preferences_makibes_hr3_settings">Impostazioni Makibes HR3</string>
<string name="devicetype_makibes_hr3">Makibes HR3</string>
<string name="devicetype_amazfit_bip_lite">Amazfit Bip Lite</string>
<string name="prefs_find_phone">Trova telefono</string>
<string name="prefs_enable_find_phone">Attivare \'\'Trova telefono\'</string>
<string name="prefs_find_phone_summary">Usa la tua band per riprodurre la suoneria del tuo telefono.</string>
<string name="prefs_find_phone_duration">Durata dello squillo in secondi</string>
<string name="maximum_duration">Durata</string>
<string name="discovery_need_to_enter_authkey">Questo dispositivo ha bisogno di una chiave di autenticazione segreta, premere a lungo sul dispositivo per inserirla. Leggi il wiki.</string>
<string name="devicetype_amazfit_gtr">Amazfit GTR</string>
<string name="pref_chart_heartrate_color_red">Rosso</string>
<string name="pref_chart_heartrate_color_orange">Arancione</string>
<string name="pref_title_chart_heartrate_color">Colore della frequenza cardiaca</string>
<string name="pref_title_chart_sleep_rolling_24_hour">Intervallo di sonno</string>
<string name="pref_chart_sleep_rolling_24_on">Ultime 24 ore</string>
<string name="pref_chart_sleep_rolling_24_off">Da mezzogiorno a mezzogiorno</string>
<string name="devicetype_amazfit_gts">Amazfit GTS</string>
<string name="devicetype_qhybrid">Fossil Q Hybrid</string>
<string name="watch_not_connected">Orologio non connesso</string>
<string name="qhybrid_vibration_strength">forza della vibrazione:</string>
<string name="qhybrid_goal_in_steps">Obiettivo in passi</string>
<string name="qhybrid_changes_delay_prompt">Il cambiamento potrebbe richiedere qualche secondo…</string>
<string name="pref_disable_new_ble_scanning">Disattivare nuove scansioni BLE</string>
<string name="pref_summary_disable_new_ble_scanning">Selezionare questa opzione se il dispositivo non può essere trovato durante il rilevamento</string>
<string name="devicetype_banglejs">Bangle.js</string>
<string name="devicetype_y5">Y5</string>
<string name="prefs_button_single_press_action_selection_title">Evento 1 azione</string>
<string name="prefs_button_double_press_action_selection_title">Evento 2 azione</string>
<string name="prefs_button_triple_press_action_selection_title">Evento 3 azione</string>
<string name="prefs_button_long_press_action_selection_title">Azione di pressione prolungata del pulsante</string>
<string name="alarm_snooze">Snooze</string>
<string name="error_no_location_access">Per il corretto funzionamento della scansione dei dispositivi occorre concedere e abilitare l\'accesso alla posizione</string>
<string name="devicetype_itag">iTag</string>
<string name="pref_title_allow_high_mtu">Consenti MTU elevato</string>
<string name="pref_summary_allow_high_mtu">Aumenta la velocità di trasferimento, ma potrebbe non funzionare su alcuni dispositivi Android.</string>
<string name="pref_title_sync_caldendar">Sincronizza gli eventi del calendario</string>
</resources>

View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">გაჯეტბრიჯი</string>
<string name="title_activity_controlcenter">გაჯეტბრიდჯი</string>
<string name="action_settings">პარამეტრები</string>
<string name="action_quit">შეწყვეტა</string>
<string name="action_donate">დონაცია</string>
<string name="controlcenter_fetch_activity_data">სინქრონიზაცია</string>
<string name="controlcenter_find_device">დაკარგული მოწყობილობის პოვნა</string>
<string name="controlcenter_change_led_color">LED ფერის შეცვლა</string>
<string name="controlcenter_change_fm_frequency">FM სიხშირის შეცვლა</string>
<string name="controlcenter_connect">დაკავშირება…</string>
<string name="controlcenter_disconnect">გათიშვა</string>
<string name="controlcenter_delete_device">მოწყობილობის წაშლა</string>
<string name="controlcenter_delete_device_name">წაშლა %1$s</string>
<string name="controlcenter_delete_device_dialogmessage">ეს წაშლის ხელსაწყოს და მასთან დაკავშირებულ ყველა მონაცემს!</string>
<string name="controlcenter_snackbar_need_longpress">დააჭირეთ ბარათს გათიშვისთვის</string>
<string name="controlcenter_snackbar_disconnecting">გათიშავს</string>
<string name="controlcenter_snackbar_connecting">აკავშირებს…</string>
<string name="controlcenter_calibrate_device">მოწყობილობის დაკალიბრება</string>
<string name="debugactivity_really_factoryreset_title">გსურთ რეალურად მოწყობილობის გადატვირთვა\?</string>
<string name="title_activity_appmanager">აპლიკაციას მენეჭერი</string>
<string name="appmanager_cached_watchapps_watchfaces">აპლიკაციები ქეშიში</string>
<string name="appmanager_installed_watchapps">დაინსტალირებული აპლიკაციები</string>
<string name="appmanager_installed_watchfaces">დაინსტალირებული ციფერბლატები</string>
<string name="appmananger_app_delete">წაშლა</string>
<string name="appmananger_app_delete_cache">წაშლა და ქეშიდან ამოღება</string>
<string name="appmananger_app_reinstall">ისევ ინსტალაცია</string>
<string name="appmanager_app_openinstore">ფებლის მაღაზიაში ძებნა</string>
<string name="appmanager_health_activate">გააქტიურება</string>
<string name="appmanager_health_deactivate">გამორტვა</string>
<string name="app_configure">კონფიგურაცია</string>
</resources>

View File

@ -9,7 +9,7 @@
<string name="controlcenter_fetch_activity_data">Sinchronizuoti</string>
<string name="controlcenter_find_device">Surasti pamestą įrenginį</string>
<string name="controlcenter_take_screenshot">Padaryti ekrano nuotrauką</string>
<string name="controlcenter_connect">Prijungti</string>
<string name="controlcenter_connect">Prijungti</string>
<string name="controlcenter_disconnect">Atjungti</string>
<string name="controlcenter_delete_device">Ištrinti įrenginį</string>
<string name="controlcenter_delete_device_name">Ištrinti %1$s</string>
@ -26,7 +26,7 @@
<string name="controlcenter_navigation_drawer_close">Užverti programos meniu</string>
<string name="controlcenter_snackbar_need_longpress">Norėdami atjungti ilgai spauskite kortelę</string>
<string name="controlcenter_snackbar_disconnecting">Atjungiama</string>
<string name="controlcenter_snackbar_connecting">Jungiama</string>
<string name="controlcenter_snackbar_connecting">Jungiama</string>
<string name="title_activity_debug">Derinti</string>
<string name="title_activity_appmanager">Programų tvarkyklė</string>
<string name="appmanager_cached_watchapps_watchfaces">Programos talpykloje</string>

View File

@ -327,7 +327,7 @@
<string name="mi2_prefs_button_actions">Knappevalg</string>
<string name="mi2_prefs_button_actions_summary">Angi knappetrykkshandlinger</string>
<string name="mi2_prefs_button_press_count">Antall trykk på knapp</string>
<string name="mi2_prefs_button_press_count_summary">Antall trykk på knapp for å utløse meldingskringkasting</string>
<string name="mi2_prefs_button_press_count_summary">Antall knappetrykk for å utløse hendelse 1. Etterfølgende likt antall trykk utløser hendelse 2, osv.</string>
<string name="mi2_prefs_button_press_broadcast">Kringkastingsmelding å sende</string>
<string name="mi2_prefs_goal_notification">Målmerknad</string>
<string name="mi2_prefs_goal_notification_summary">Båndet vil vibrere når daglig stegmål nås</string>
@ -445,7 +445,7 @@
<string name="pref_summary_pebble_always_ack_pebblekit">Meldinger sendt til eksterne tredjepartsprogrammer vil alltid bli anerkjent umiddelbart</string>
<string name="pref_title_screentime">Demp skjerm etter</string>
<string name="miband_prefs_device_time_offset_hours">Tidsjustering i timer (for oppdagelse av søvn for skiftarbeidere)</string>
<string name="mi2_prefs_button_press_broadcast_summary">Kringkast melding ved et gitt antall knappetrykk</string>
<string name="mi2_prefs_button_press_broadcast_summary">Kringkastingsmelding sendt sammen med hendelsen. Parameter `button_id` legges til automatisk for hver melding.</string>
<string name="mi2_prefs_button_action">Skru på knappehandling</string>
<string name="mi2_prefs_button_action_summary">Skru på handling ved gitt antall knappetrykk</string>
<string name="mi2_prefs_button_action_vibrate">Skru på båndvibrasjon</string>
@ -826,4 +826,14 @@
<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>
<string name="pref_summary_sync_calendar">Skru på kalendervarsler, selv når frakoblet.</string>
<string name="pref_title_sync_caldendar">Synkroniser kalenderhendelser</string>
<string name="hr_widget_heart_rate">Puls</string>
<string name="hr_widget_steps">Steg</string>
<string name="hr_widget_date">Dato</string>
<string name="hr_widget_active_minutes">Aktive minutter</string>
<string name="hr_widget_calories">Kalorier</string>
<string name="hr_widget_battery">Batteri</string>
<string name="hr_widget_weather">Vær</string>
<string name="hr_widget_nothing">Ingenting</string>
</resources>

View File

@ -6,19 +6,19 @@
<string name="action_debug">Debug</string>
<string name="action_quit">Sluit af</string>
<string name="action_donate">Doneer</string>
<string name="controlcenter_fetch_activity_data">Synchroniseren</string>
<string name="controlcenter_find_device">Zoek verloren Toestel</string>
<string name="controlcenter_fetch_activity_data">Synchroniseer</string>
<string name="controlcenter_find_device">Zoek verloren toestel</string>
<string name="controlcenter_take_screenshot">Screenshot maken</string>
<string name="controlcenter_disconnect">Loskoppelen</string>
<string name="controlcenter_delete_device">Apparaat Verwijderen</string>
<string name="controlcenter_disconnect">Ontkoppel</string>
<string name="controlcenter_delete_device">Verwijder apparaat</string>
<string name="controlcenter_delete_device_name">Verwijder %1$s</string>
<string name="controlcenter_delete_device_dialogmessage">Dit zal het apparaat en alle bijbehorende gegevens verwijderen!</string>
<string name="controlcenter_snackbar_need_longpress">Druk lang op de kaart om los te koppelen</string>
<string name="controlcenter_snackbar_disconnecting">Loskoppelen</string>
<string name="controlcenter_snackbar_need_longpress">Druk lang op de kaart om te ontkoppelen</string>
<string name="controlcenter_snackbar_disconnecting">Ontkoppelen</string>
<string name="controlcenter_snackbar_connecting">Verbinden…</string>
<string name="controlcenter_snackbar_requested_screenshot">Een screenshot maken van het apparaat</string>
<string name="title_activity_debug">Debug</string>
<string name="title_activity_appmanager">App Beheerder</string>
<string name="title_activity_appmanager">App-beheerder</string>
<string name="appmanager_cached_watchapps_watchfaces">Apps in de cache</string>
<string name="appmanager_installed_watchapps">Geïnstalleerde apps</string>
<string name="appmanager_installed_watchfaces">Geïnstalleerde wijzerplaten</string>
@ -26,13 +26,13 @@
<string name="appmananger_app_delete_cache">Verwijder en verwijder uit cache</string>
<string name="appmananger_app_reinstall">Herinstalleer</string>
<string name="appmanager_app_openinstore">Zoek in Pebble appstore</string>
<string name="appmanager_health_activate">Activeren</string>
<string name="appmanager_health_deactivate">Deactiveren</string>
<string name="appmanager_health_activate">Activeer</string>
<string name="appmanager_health_deactivate">Deactiveer</string>
<string name="appmanager_hrm_activate">Activeer HRM</string>
<string name="appmanager_hrm_deactivate">Deactiveer HRM</string>
<string name="appmanager_weather_activate">Activeer de systeem weer app</string>
<string name="appmanager_weather_install_provider">Installeer de app voor weer meldingen</string>
<string name="app_configure">Configureren</string>
<string name="app_configure">Configureer</string>
<string name="app_move_to_top">Verplaats naar de top</string>
<string name="title_activity_appblacklist">Melding zwarte lijst</string>
<string name="fw_upgrade_notice">U staat op het punt om firmware %s te installeren.</string>
@ -54,7 +54,7 @@
<string name="pref_title_general_autoconnectonbluetooth">Verbind met Gadgetbridge apparaat wanneer Bluetooth is ingeschakeld</string>
<string name="pref_title_general_autostartonboot">Start automatisch</string>
<string name="pref_title_general_autoreconnect">Verbind automatisch opnieuw</string>
<string name="pref_title_audio_player">Gewenste Audiospeler</string>
<string name="pref_title_audio_player">Gewenste audiospeler</string>
<string name="pref_default">Standaard</string>
<string name="pref_header_datetime">Datum en tijd</string>
<string name="pref_title_datetime_syctimeonconnect">Sync tijd</string>
@ -166,7 +166,7 @@
<string name="pref_summary_pebble_enable_bgjs">Wanneer ingeschakeld, kunnen horloges het weer, batterij-informatie enz. weergeven.</string>
<string name="pref_title_pebble_reconnect_attempts">Pogingen tot opnieuw verbinden</string>
<string name="pref_title_unit_system">Eenheden</string>
<string name="pref_title_timeformat">Tijd weergave</string>
<string name="pref_title_timeformat">Tijdsformaat</string>
<string name="pref_title_screentime">Tijd dat scherm aan is</string>
<string name="prefs_title_all_day_heart_rate">"De hele dag hartslag meten"</string>
<string name="preferences_hplus_settings">HPlus/Makibes instellingen</string>
@ -343,7 +343,7 @@
<string name="miband_prefs_reserve_alarm_calendar">Alarmen gereserveerd voor toekomstige gebeurtenissen</string>
<string name="miband_prefs_hr_sleep_detection">Gebruik hartslag sensor om slaap detectie te verbeteren</string>
<string name="miband_prefs_device_time_offset_hours">Toestel tijdsverschuiving in uren (voor het detecteren van slaap van ploegarbeiders)</string>
<string name="miband2_prefs_dateformat">Datum formaat</string>
<string name="miband2_prefs_dateformat">Datumformaat</string>
<string name="dateformat_time">Tijd</string>
<string name="dateformat_date_time">Tijd &amp; datum</string>
<string name="mi2_prefs_button_actions">Knoppen acties</string>
@ -426,7 +426,7 @@
<string name="dbmanagementactivity_old_activity_db_deletion_failed">Oude activiteitsdatabase verwijderen mislukt.</string>
<string name="dbmanagementactivity_overwrite">Overschrijven</string>
<string name="Cancel">Annuleren</string>
<string name="Delete">Verwijderen</string>
<string name="Delete">Verwijder</string>
<string name="title_activity_vibration">Vibratie</string>
<string name="title_activity_pebble_pairing">Pebble koppelen</string>
<string name="pebble_pairing_hint">Er zal een koppelingsdialoogvenster verschijnen op uw Android-apparaat. Als dat niet gebeurt, kijk dan tussen uw meldingen en accepteer het koppelingsverzoek. Accepteer het daarna ook op uw Pebble.</string>
@ -519,7 +519,7 @@
<string name="activity_summaries">Activiteiten</string>
<string name="activity_type_biking">Fietsen</string>
<string name="activity_type_treadmill">Loopband</string>
<string name="select_all">Alles selecteren</string>
<string name="select_all">Selecteer alles</string>
<string name="share">Delen</string>
<string name="devicetype_miband3">Mi Band 3</string>
<string name="devicetype_q8">Q8</string>
@ -554,10 +554,10 @@
<string name="reset_index">Herstel ophaal datum</string>
<string name="devicetype_mykronoz_zetime">MyKronoz ZeTime</string>
<string name="menuitem_notifications">Meldingen</string>
<string name="controlcenter_change_led_color">Wijzig LED kleur</string>
<string name="controlcenter_change_led_color">Wijzig ledkleur</string>
<string name="controlcenter_change_fm_frequency">Wijzig FM frequentie</string>
<string name="debugactivity_really_factoryreset_title">Weet U zeker dat u de fabrieksinstellingen wilt terugzetten\?</string>
<string name="debugactivity_really_factoryreset">Het terugzetten van de fabrieksinstellingen zal alle data van het verbonden toestel verwijderen (indien ondersteund). Xiaomi/Huami toestellen veranderen ook van Bluetooth MAC address, zodat deze zullen verschijnen als nieuwe toestellen in Gadgetbridge.</string>
<string name="debugactivity_really_factoryreset">Het terugzetten van de fabrieksinstellingen zal alle data van het verbonden toestel verwijderen (indien ondersteund). Xiaomi/Huami toestellen veranderen ook van Bluetooth MAC-adres, zodat deze zullen verschijnen als nieuwe toestellen in Gadgetbridge.</string>
<string name="pref_title_notifications_timeout">Minimum tijd tussen meldingen</string>
<string name="pref_title_rtl">Van rechts naar links</string>
<string name="pref_summary_rtl">Schakel dit in als uw toestel geen talen van rechts naar links kan weergeven</string>
@ -606,8 +606,8 @@
<string name="share_log_warning">Hou er alsjeblieft rekening mee dat Gadgetbridge bestanden logt die veel persoonlijke informatie kunnen bevatten, inclusief maar niet gelimiteerd tot gezondheidsgegevens, unieke identificatiegegevens (zoals het MAC adres van een toestel), muziek voorkeuren, enz. Overweeg deze handmatig verwijderen van deze gegevens uit dit bestand alvorens deze te verzenden naar een publiek foutrapport.</string>
<string name="warning">Waarschuwing!</string>
<string name="no_data">Geen data</string>
<string name="preferences_led_color">LED Kleur</string>
<string name="preferences_fm_frequency">FM frequentie</string>
<string name="preferences_led_color">Ledkleur</string>
<string name="preferences_fm_frequency">FM-frequentie</string>
<string name="pref_invalid_frequency_title">Ongeldige frequentie</string>
<string name="pref_invalid_frequency_message">Voer een frequentie in tussen 87,5 en 108,0</string>
<string name="language_and_region_prefs">Taal en regio instellingen</string>
@ -646,7 +646,7 @@
<string name="zetime_calories_type">Soort calorieën</string>
<string name="zetime_calories_type_active">Alleen calorieën verbrand gedurende activiteiten</string>
<string name="zetime_calories_type_all">Verbrande calorieën actief en inactief</string>
<string name="zetime_date_format">Datum formaat</string>
<string name="zetime_date_format">Datumformaat</string>
<string name="zetime_date_format_1">YY/MM/DD</string>
<string name="zetime_date_format_2">DD/MM/YY</string>
<string name="zetime_date_format_3">MM/DD/YY</string>
@ -723,8 +723,8 @@
<string name="weeksleepchart_sleep_a_month">Slaap per maand</string>
<string name="devicetype_mijia_lywsd02">Mijia Smart Clock</string>
<string name="menuitem_nfc">NFC</string>
<string name="pref_summary_expose_hr">Sta toe dat andere apps HR data in realtime benaderen terwijl Gadgetbridge verbonden is</string>
<string name="pref_title_expose_hr">Derde partij realtime HR toegang</string>
<string name="pref_summary_expose_hr">Sta andere apps toe HR-data te benaderen in realtime terwijl Gadgetbridge verbonden is</string>
<string name="pref_title_expose_hr">realtime HR-toegang door derden</string>
<string name="pref_title_use_custom_font">Gebruik aangepast lettertype</string>
<string name="pref_summary_use_custom_font">Selecteer dit als je device aangepaste font software bevat met emoji ondersteuning</string>
<string name="activity_db_management_autoexport_explanation">Database autoexport locatie is ingesteld op:</string>
@ -738,10 +738,10 @@
<string name="activity_db_management_empty_DB">Leeg Database</string>
<string name="activity_db_management_exportimport_label">Exporteer en importeer</string>
<string name="activity_db_management_empty_db_warning">Waarschuwing! Als je op deze knop drukt wis je je database en start je met een schone lei.</string>
<string name="appwidget_sleep_alarm_widget_label">Slaap Alarm</string>
<string name="appwidget_sleep_alarm_widget_label">Slaapalarm</string>
<string name="widget_steps_label">Stappen: %1$02d</string>
<string name="widget_sleep_label">Slaap: %1$s</string>
<string name="widget_listing_label">Status en Alarmen</string>
<string name="widget_listing_label">Status en alarmen</string>
<string name="widget_set_alarm_after">Zet alarm na:</string>
<string name="widget_5_minutes">5 minuten</string>
<string name="widget_10_minutes">10 minuten</string>
@ -795,7 +795,7 @@
\nGA VERDER OP EIGEN RISICO!</string>
<string name="mi2_prefs_button_press_broadcast_default_value" translatable="false">nodomain.freeyourgadget.gadgetbridge.ButtonPressed</string>
<string name="devicetype_qhybrid">Fossil Q Hybrid</string>
<string name="preferences_qhybrid_settings">Q Hybrid Instellingen</string>
<string name="preferences_qhybrid_settings">Q Hybrid instellingen</string>
<string name="watch_not_connected">Horloge niet verbonden</string>
<string name="qhybrid_vibration_strength">trillingssterkte:</string>
<string name="qhybrid_goal_in_steps">Doel in stappen</string>
@ -823,4 +823,6 @@
<string name="devicetype_itag">iTag</string>
<string name="pref_title_allow_high_mtu">Hoge MTU toestaan</string>
<string name="pref_summary_allow_high_mtu">Verhoogt de overdrachtssnelheid, maar werkt mogelijk niet op sommige Android-apparaten.</string>
<string name="pref_summary_sync_calendar">Schakelt agendameldingen in, zelfs wanneer U niet verbonden bent</string>
<string name="pref_title_sync_caldendar">Agenda-afspraken synchroniseren</string>
</resources>

View File

@ -825,4 +825,5 @@
<string name="devicetype_itag">iTag</string>
<string name="error_no_location_access">Dostęp do lokalizacji musi zostać przyznany i włączony, aby skanowanie działało poprawnie</string>
<string name="pref_summary_allow_high_mtu">Zwiększa szybkość transferu, ale może nie działać na niektórych urządzeniach z Androidem.</string>
<string name="pref_title_allow_high_mtu">Zezwól na wysoki MTU</string>
</resources>

View File

@ -835,4 +835,6 @@
<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>
<string name="pref_summary_sync_calendar">Possibilita alertas de calendário, mesmo quando desconectado</string>
<string name="pref_title_sync_caldendar">Sincronizar eventos de calendário</string>
</resources>

View File

@ -4,7 +4,7 @@
<string name="title_activity_controlcenter">Gadgetbridge</string>
<string name="action_settings">Настройки</string>
<string name="action_debug">Отладка</string>
<string name="action_quit">Выход</string>
<string name="action_quit">Выйти</string>
<string name="controlcenter_fetch_activity_data">Синхронизировать</string>
<string name="controlcenter_find_device">Найти устройство</string>
<string name="controlcenter_take_screenshot">Сделать снимок экрана</string>
@ -14,26 +14,26 @@
<string name="controlcenter_delete_device_dialogmessage">Устройство и вся связанная с ним информация будут удалены!</string>
<string name="controlcenter_navigation_drawer_open">Открыть панель навигации</string>
<string name="controlcenter_navigation_drawer_close">Закрыть панель навигации</string>
<string name="controlcenter_snackbar_need_longpress">Чтобы разъединиться, нажмите на карточку устройства и удержите</string>
<string name="controlcenter_snackbar_disconnecting">Разъединение</string>
<string name="controlcenter_snackbar_connecting">Соединение</string>
<string name="controlcenter_snackbar_requested_screenshot">Сделать снимок устройства</string>
<string name="controlcenter_snackbar_need_longpress">Долгое нажатие отключит устройство</string>
<string name="controlcenter_snackbar_disconnecting">Отключается</string>
<string name="controlcenter_snackbar_connecting">Подключается</string>
<string name="controlcenter_snackbar_requested_screenshot">Делается снимок устройства</string>
<string name="title_activity_debug">Отладка</string>
<!--Strings related to AppManager-->
<string name="title_activity_appmanager">Управление приложением</string>
<string name="appmanager_cached_watchapps_watchfaces">Приложения в памяти</string>
<string name="appmanager_cached_watchapps_watchfaces">Приложения в кеше</string>
<string name="appmanager_installed_watchapps">Установленные приложения</string>
<string name="appmanager_installed_watchfaces">Установленный циферблаты</string>
<string name="appmanager_installed_watchfaces">Установленные циферблаты</string>
<string name="appmananger_app_delete">Удалить</string>
<string name="appmananger_app_delete_cache">Удалить и очистить кеш</string>
<string name="appmananger_app_reinstall">Переустановка</string>
<string name="appmananger_app_reinstall">Переустановить</string>
<string name="appmanager_app_openinstore">Искать в магазине Pebble</string>
<string name="appmanager_health_activate">Активировать</string>
<string name="appmanager_health_deactivate">Деактивировать</string>
<string name="appmanager_hrm_activate">Включить монитор сердечного ритма</string>
<string name="appmanager_hrm_deactivate">Выключить монитор сердечного ритма</string>
<string name="appmanager_weather_activate">Включить системное приложение прогноза погоды</string>
<string name="appmanager_weather_deactivate">Выключить системное приложение прогноза погоды</string>
<string name="appmanager_hrm_activate">Включить пульсометр</string>
<string name="appmanager_hrm_deactivate">Выключить пульсометр</string>
<string name="appmanager_weather_activate">Включить системный прогноз погоды</string>
<string name="appmanager_weather_deactivate">Выключить системный прогноз погоды</string>
<string name="appmanager_weather_install_provider">Установить уведомления для прогноза погоды</string>
<string name="app_configure">Настроить</string>
<string name="app_move_to_top">Переместить наверх</string>
@ -41,58 +41,58 @@
<string name="title_activity_appblacklist">Заблокированные уведомления</string>
<!--Strings related to CalBlacklist-->
<!--Strings related to FwAppInstaller-->
<string name="title_activity_fw_app_insaller">Установщик прошивки/приложений</string>
<string name="title_activity_fw_app_insaller">Установка прошивки и приложений</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_known">Эта прошивка была проверена: она совместима с Gadgetbridge.</string>
<string name="miband_firmware_unknown_warning">Эта прошивка не протестирована и может быть несовместима с Gadgetbridge.
\n
\nНЕ РЕКОМЕНДУЕТСЯ устанавливать её!</string>
<string name="miband_firmware_suggest_whitelist">Если вы установите эту прошивку и убедитесь, что всё работает без сбоев, пожалуйста, сообщите об этом разработчикам Gadgetbridge. Они пометят эту версию прошивки (%s) как совместимую.</string>
<!--Strings related to Settings-->
<string name="title_activity_settings">Настройки</string>
<string name="pref_header_general">Общие настройки</string>
<string name="pref_title_general_autoconnectonbluetooth">Подключение к зарегистрированному устройству при активации Bluetooth</string>
<string name="pref_header_general">Общие</string>
<string name="pref_title_general_autoconnectonbluetooth">Подключаться к добавленному устройству при включении Bluetooth</string>
<string name="pref_title_general_autostartonboot">Запускать автоматически</string>
<string name="pref_title_general_autoreconnect">Переподключаться автоматически</string>
<string name="pref_title_audio_player">Предпочтительный музыкальный плеер</string>
<string name="pref_default">По умолчанию</string>
<string name="pref_header_datetime">Дата и время</string>
<string name="pref_title_datetime_syctimeonconnect">Синхронизировать время при подключении</string>
<string name="pref_summary_datetime_syctimeonconnect">Синхронизировать время при подключении к зарегистрированному устройству, а также при изменении времени или временной зоны в системных настройках</string>
<string name="pref_title_datetime_syctimeonconnect">Синхронизировать время</string>
<string name="pref_summary_datetime_syctimeonconnect">Синхронизировать время на добавленном устройстве при подключении, установке времени или часового пояса</string>
<string name="pref_title_theme">Тема</string>
<string name="pref_theme_light">Светлая</string>
<string name="pref_theme_dark">Темная</string>
<string name="pref_theme_dark">Тёмная</string>
<string name="pref_title_language">Язык</string>
<string name="pref_title_minimize_priority">Прятать уведомление Gadgetbridge</string>
<string name="pref_summary_minimize_priority_off">Показывать значок в строке состояния и уведомление на экране блокировки</string>
<string name="pref_summary_minimize_priority_on">Не показывать значок в строке состояния и уведомление на экране блокировки</string>
<string name="pref_title_minimize_priority">Скрывать уведомление Gadgetbridge</string>
<string name="pref_summary_minimize_priority_off">Показывает значок в строке состояния и уведомление на экране блокировки</string>
<string name="pref_summary_minimize_priority_on">Не показывает значок в строке состояния и уведомление на экране блокировки</string>
<string name="pref_header_notifications">Уведомления</string>
<string name="pref_title_notifications_repetitions">Повторы</string>
<string name="pref_title_notifications_call">Вызовы</string>
<string name="pref_title_notifications_sms">СМС-сообщения</string>
<string name="pref_title_notifications_call">Телефонные звонки</string>
<string name="pref_title_notifications_sms">SMS-сообщения</string>
<string name="pref_title_notifications_pebblemsg">Сообщения Pebble</string>
<string name="pref_summary_notifications_pebblemsg">Поддержка приложений, которые отправляют уведомления на Pebble с помощью PebbleKit.</string>
<string name="pref_title_notifications_generic">Поддержка обычных уведомлений</string>
<string name="pref_title_whenscreenon">… даже когда экран включён</string>
<string name="pref_summary_notifications_pebblemsg">Для приложений, которые отправляют уведомления на Pebble с помощью PebbleKit.</string>
<string name="pref_title_notifications_generic">Доступ к уведомлениям</string>
<string name="pref_title_whenscreenon">Уведомления при включённом экране</string>
<string name="pref_title_notification_filter">Не беспокоить</string>
<string name="pref_summary_notification_filter">Предотвращать отправку нежелательных уведомлений в режиме \"Не беспокоить\"</string>
<string name="pref_summary_notification_filter">Не показывать нежелательные уведомления в этом режиме</string>
<string name="pref_title_transliteration">Транслитерация</string>
<string name="always">Всегда</string>
<string name="pref_summary_transliteration">Включите эту функцию, если ваше устройство не имеет поддержки шрифта на вашем языке</string>
<string name="pref_summary_transliteration">Включите, если на устройстве нет шрифта для вашего языка</string>
<string name="when_screen_off">Когда экран выключен</string>
<string name="never">Никогда</string>
<string name="pref_header_privacy">Конфиденциальность</string>
<string name="pref_title_call_privacy_mode">Конфиденциальность вызовов</string>
<string name="pref_call_privacy_mode_off">Отображать имя и номер</string>
<string name="pref_call_privacy_mode_name">Скрывать имя, но отображать номер</string>
<string name="pref_call_privacy_mode_number">Скрывать номер, но отображать имя</string>
<string name="pref_call_privacy_mode_off">Показывать имя и номер</string>
<string name="pref_call_privacy_mode_name">Скрывать имя, но показывать номер</string>
<string name="pref_call_privacy_mode_number">Скрывать номер, но показывать имя</string>
<string name="pref_call_privacy_mode_complete">Скрывать имя и номер</string>
<string name="pref_blacklist">Заблокированные приложения</string>
<string name="pref_header_cannned_messages">Сохранённые сообщения</string>
<string name="pref_title_canned_replies">Ответы</string>
<string name="pref_title_canned_reply_suffix">Общий суффикс</string>
<string name="pref_title_canned_messages_dismisscall">Пропущенные вызовы</string>
<string name="pref_title_canned_messages_dismisscall">Отклонённые звонки</string>
<string name="pref_title_canned_messages_set">Обновить на Pebble</string>
<string name="pref_header_development">Настройки для разработчиков</string>
<string name="pref_title_development_miaddr">Адрес Mi Band</string>
@ -122,7 +122,7 @@
<string name="pref_title_location_longitude">Долгота</string>
<string name="pref_title_location_keep_uptodate">Обновлять местоположение</string>
<string name="pref_summary_location_keep_uptodate">Попробуйте получить текущее местоположение во время выполнения, используйте сохраненное местоположение в качестве резервного</string>
<string name="toast_enable_networklocationprovider">Пожалуйста, включите сетевое расположение</string>
<string name="toast_enable_networklocationprovider">Включите местоположение по сети</string>
<string name="toast_aqurired_networklocation">Месторасположение определено</string>
<string name="pref_title_pebble_forceprotocol">Принудительный протокол уведомлений</string>
<string name="pref_summary_pebble_forceprotocol">Эта настройка принудительно использует самый новый протокол уведомлений (зависит от версии прошивки). ВКЛЮЧАЙТЕ, ЕСЛИ ТОЧНО ЗНАЕТЕ, ЗАЧЕМ ВЫ ЭТО ДЕЛАЕТЕ!</string>
@ -198,7 +198,7 @@
<string name="title_activity_sleepmonitor">Анализ фаз сна</string>
<string name="pref_write_logfiles">Сохранять файлы журнала</string>
<string name="initializing">Запускается</string>
<string name="busy_task_fetch_activity_data">Получение данных активности</string>
<string name="busy_task_fetch_activity_data">Передаёт данные активности</string>
<string name="sleep_activity_date_range">От %1$s до %2$s</string>
<string name="prefs_wearside">Носите на левой или правой руке?</string>
<string name="pref_screen_vibration_profile">Профиль настроек вибрации</string>
@ -306,7 +306,7 @@
<string name="miband2_prefs_dateformat">Формат даты</string>
<string name="dateformat_time">Время</string>
<string name="dateformat_date_time">Время и дата</string>
<string name="mi2_prefs_activate_display_on_lift">Активировать экран при подъёме</string>
<string name="mi2_prefs_activate_display_on_lift">Активировать экран поднятием руки</string>
<string name="FetchActivityOperation_about_to_transfer_since">Готов к передаче данных с %1$s</string>
<string name="waiting_for_reconnect">Ожидание переподключения</string>
<string name="activity_prefs_about_you">Ваши данные</string>
@ -332,11 +332,9 @@
<string name="pref_summary_pebble_health_store_raw">Если флажок установлен, данные сохраняются как есть. В дальнейшем их можно будет обрабатывать. Обратите внимание: в этом случае база данных будет занимать больше места.</string>
<string name="action_db_management">Управление базой данных</string>
<string name="title_activity_db_management">Управление базой данных</string>
<string name="activity_db_management_import_export_explanation">"Операции с базой данных используют этот путь на устройстве.
\n
\nОн доступен для других приложений Android и. компьютера.
\n
\nВы можете найти экспортированную базу данных (или разместить базу данных, которую вы хотите импортировать) здесь:"</string>
<string name="activity_db_management_import_export_explanation">Операции с базой данных используют этот путь на устройстве.
\nОн доступен для других приложений Android и компьютера.
\nВы можете найти экспортированную базу данных (или разместить базу данных, которую вы хотите импортировать) здесь:</string>
<string name="activity_db_management_merge_old_title">Удаление устаревшей базы данных</string>
<string name="dbmanagementactivvity_cannot_access_export_path">Нет доступа к пути экспорта. Обратитесь, пожалуйста, к разработчикам.</string>
<string name="dbmanagementactivity_exported_to">Экспортировано в: %1$s</string>
@ -396,22 +394,22 @@
<string name="action_donate">Пожертвовать</string>
<string name="controlcenter_connect">Подключить…</string>
<string name="title_activity_calblacklist">Заблокированные календари</string>
<string name="fw_upgrade_notice_amazfitbip">Вы собираетесь установить прошивку %s на ваш Amazfit Bip.
\n
\nСоблюдайте последовательность: вначале установите файл .fw, затем .res, и затем .gps. После установки файла .fw часы перезагрузятся.
\n
\nОбратите внимание: если файлы .gps и .res такие же, как в текущей версии, их не нужно переустанавливать.
\n
\nВЫ ДЕЙСТВУЕТЕ НА СВОЙ СТРАХ И РИСК!</string>
<string name="fw_upgrade_notice_amazfitcor">Вы собираетесь установить прошивку %s на ваш Amazfit Cor.
\n
\nСоблюдайте последовательность: вначале установите файл .fw, затем .res. После установки файла .fw часы перезагрузятся.
\n
\nОбратите внимание: если версия файла .res совпадает с установленной, его не нужно переустанавливать.
\n
\nВЫ ДЕЙСТВУЕТЕ НА СВОЙ СТРАХ И РИСК!</string>
<string name="fw_upgrade_notice_amazfitbip">Вы собираетесь установить прошивку %s на ваш Amazfit Bip.
\n
\nБудьте внимательны: сначала установите файл .fw, затем .res, и затем .gps. После установки файла .fw часы перезагрузятся.
\n
\nЕсли файлы .gps и .res такие же, как в текущей версии, их не нужно переустанавливать.
\n
\nВы действуете на свой страх и риск!</string>
<string name="fw_upgrade_notice_amazfitcor">Вы собираетесь установить прошивку %s на ваш Amazfit Cor.
\n
\nБудьте внимательны: сначала установите файл .fw, затем .res. После установки файла .fw часы перезагрузятся.
\n
\nЕсли файл и .res такой же, как в текущей версии, его не нужно переустанавливать.
\n
\nВы действуете на свой страх и риск!</string>
<string name="pref_title_charts_swipe">Включить жесты \"провести направо и налево\" в графиках активности</string>
<string name="pref_blacklist_calendars">Заблокировать Календари</string>
<string name="pref_blacklist_calendars">Заблокированные календари</string>
<string name="pref_header_pebble_timeline">Временной график Pebble</string>
<string name="pref_title_pebble_enable_bgjs">Включить JS в фоновом режиме</string>
<string name="pref_summary_pebble_enable_bgjs">Включают, чтобы видеть погоду, заряд батарейки и т.д. на циферблате.</string>
@ -430,14 +428,14 @@
<string name="battery">Заряд батарейки</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_count">Кол-во нажатий на кнопку</string>
<string name="mi2_prefs_button_press_count_summary">Количество нажатий, необходимое для генерации События 1. Ещё столько же нажатий потребуется для генерации События 2 и т.д.</string>
<string name="mi2_prefs_button_press_broadcast">Сообщение для трансляции</string>
<string name="mi2_prefs_button_press_broadcast_summary">Сообщение транслируемое при наступлении события. Параметр `button_id` добавляется к каждому сообщению автоматически.</string>
<string name="mi2_prefs_button_action">Включить действия при нажатии на кнопку</string>
<string name="mi2_prefs_button_action_summary">Включить действия для заданного количества нажатий на кнопку</string>
<string name="mi2_prefs_button_action_vibrate">Включить вибрацию</string>
<string name="mi2_prefs_button_action_vibrate_summary">Включить вибрацию браслета в ответ на исполняющееся при нажатии действие</string>
<string name="mi2_prefs_button_press_broadcast_summary">Отправлять сообщение при наступлении события. Параметр `button_id` добавляется к каждому сообщению автоматически.</string>
<string name="mi2_prefs_button_action">Включить действия для кнопки</string>
<string name="mi2_prefs_button_action_summary">Включить действия на заданное кол-во нажатий кнопки</string>
<string name="mi2_prefs_button_action_vibrate">Включить вибро-отклик браслета</string>
<string name="mi2_prefs_button_action_vibrate_summary">Включить вибро-отклик браслета в ответ на исполнение действия при нажатии</string>
<string name="mi2_prefs_button_press_count_max_delay">Максимальная задержка между нажатиями</string>
<string name="mi2_prefs_button_press_count_max_delay_summary">Максимальная задержка между нажатиями в миллисекундах</string>
<string name="mi2_prefs_button_press_count_match_delay">Задержка после действия при нажатии</string>
@ -446,7 +444,7 @@
<string name="mi2_prefs_goal_notification_summary">Браслет завибрирует, когда будет выполнена дневная норма шагов</string>
<string name="mi2_prefs_display_items">Что показывать на экране</string>
<string name="mi2_prefs_display_items_summary">Выберите, что показывать на экране браслета</string>
<string name="mi2_prefs_rotate_wrist_to_switch_info">Поверните запястье, чтобы переключиться на другую информацию</string>
<string name="mi2_prefs_rotate_wrist_to_switch_info">Переключать информацию поворотом запястья</string>
<string name="mi2_prefs_do_not_disturb">Не беспокоить</string>
<string name="mi2_prefs_do_not_disturb_summary">Браслет не будет получать уведомления, даже если включён</string>
<string name="mi2_prefs_inactivity_warnings">Напоминания о низкой активности</string>
@ -479,23 +477,23 @@
<string name="menuitem_weather">Погода</string>
<string name="menuitem_compass">Компас</string>
<string name="menuitem_settings">Настройки</string>
<string name="blacklist_all_for_notifications">Заблокировать все уведомления</string>
<string name="whitelist_all_for_notifications">Разблокировать все уведомления</string>
<string name="blacklist_all_for_notifications">Заблокировать все</string>
<string name="whitelist_all_for_notifications">Разблокировать все</string>
<string name="fw_upgrade_notice_miband3">Вы собираетесь установить прошивку %s на ваш Mi Band 3.
\n
\nСоблюдайте последовательность: вначале установите файл .fw, затем .res. После установки файла .fw часы перезагрузятся.
\n
\nОбратите внимание: если версия файла .res совпадает с установленной, его не нужно переустанавливать.
\n
\nСоблюдайте последовательность: вначале установите файл .fw, затем .res. После установки файла .fw часы перезагрузятся.
\n
\nОбратите внимание: если версия файла .res совпадает с установленной, его не нужно переустанавливать.
\n
\nНЕ ПРОВЕРЯЛОСЬ, ЕСТЬ ВЕРОЯТНОСТЬ СЛОМАТЬ ВАШЕ УСТРОЙСТВО. ВЫ ДЕЙСТВУЕТЕ НА СВОЙ СТРАХ И РИСК!</string>
<string name="pref_title_weather_location">Местоположение для погоды (CM/LOS)</string>
<string name="pref_title_pebble_gatt_clientonly">Подключаться только в режиме GATT-клиента</string>
<string name="pref_summary_pebble_gatt_clientonly">Экспериментальные настройки только для Pebble 2. Попробуйте, если связь не очень</string>
<string name="pref_header_auto_export">Автоматический экспорт данных</string>
<string name="pref_title_auto_export_enabled">Включить автоматический экспорт</string>
<string name="pref_title_auto_export_location">Путь экспорта</string>
<string name="pref_title_auto_export_enabled">Автоматический экспорт включён</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="pref_summary_auto_export_interval">Экспортировать раз в %d ч.</string>
<string name="spanish">Испанский</string>
<string name="russian">Русский</string>
<string name="activity_type_not_measured">Не измерялось</string>
@ -532,15 +530,15 @@
<string name="devicetype_xwatch">XWatch</string>
<string name="devicetype_mykronoz_zetime">MyKronoz ZeTime</string>
<string name="prefs_screen_orientation">Ориентация экрана</string>
<string name="pref_auto_fetch">Автозагрузка данных об активности</string>
<string name="pref_auto_fetch_summary">Загрузка данных при каждой разблокировке экрана. Это работает только при включенной блокировке экрана!</string>
<string name="pref_auto_fetch_limit_fetches">Минимальный интервал между загрузками</string>
<string name="pref_auto_fetch_limit_fetches_summary">Загружать каждые %d минут(ы)</string>
<string name="pref_auto_fetch">Автоматически получать данные</string>
<string name="pref_auto_fetch_summary">Получать данные активности при разблокировке. Работает только при настроенной блокировке экрана!</string>
<string name="pref_auto_fetch_limit_fetches">Минимальный интервал</string>
<string name="pref_auto_fetch_limit_fetches_summary">Получать раз в %d мин.</string>
<string name="horizontal">Горизонтально</string>
<string name="vertical">Вертикально</string>
<string name="controlcenter_start_activity_tracks">Отслеживание активности</string>
<string name="activity_summaries">Статистика активности</string>
<string name="reset_index">Сбросить дату загрузки</string>
<string name="reset_index">Сбросить дату получения</string>
<string name="kind_invalid">Недопустимый формат данных</string>
<string name="kind_gps_almanac">Данные GPS</string>
<string name="kind_gps_cep">Поправка ошибки GPS</string>
@ -552,7 +550,7 @@
<string name="menuitem_notifications">Уведомления</string>
<string name="menuitem_more">Ещё</string>
<string name="menuitem_music">Музыка</string>
<string name="controlcenter_calibrate_device">Калибровать устройство</string>
<string name="controlcenter_calibrate_device">Откалибровать устройство</string>
<string name="watch9_pairing_tap_hint">Когда устройство завибрирует, встряхните его или нажмите на кнопку.</string>
<string name="devicetype_watch9">Watch 9</string>
<string name="watch9_time_minutes">Минут:</string>
@ -589,8 +587,8 @@
<string name="mi3_prefs_night_mode_summary">Автоматически снижать яркость экрана устройства по ночам</string>
<string name="mi3_night_mode_sunset">На закате</string>
<string name="ok">Принято</string>
<string name="controlcenter_change_led_color">Изменить цвет излучения светодиода</string>
<string name="controlcenter_change_fm_frequency">Изменить частоту УКВ</string>
<string name="controlcenter_change_led_color">Изменить цвет светодиода</string>
<string name="controlcenter_change_fm_frequency">Изменить FM-частоту</string>
<string name="devicetype_roidmi">Roidmi</string>
<string name="devicetype_roidmi3">Roidmi 3</string>
<string name="preferences_led_color">Цвет излучения светодиода</string>
@ -604,11 +602,11 @@
<string name="activity_prefs_chart_max_heart_rate">Максимальный пульс</string>
<string name="activity_prefs_chart_min_heart_rate">Минимальный пульс</string>
<string name="pref_title_rtl">Справа налево</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="pref_summary_rtl">Включите, если устройство не отображает письмо справа налево</string>
<string name="pref_rtl_max_line_length">Длина строки при вводе справа налево</string>
<string name="pref_rtl_max_line_length_summary">Изменить длину строк в тексте с письмом справа налево</string>
<string name="pref_title_contextual_arabic">Контекстные формы для арабского языка</string>
<string name="pref_summary_contextual_arabic">Включает поддержку контекстных форм арабского языка</string>
<string name="pref_summary_contextual_arabic">Включить поддержку контекстных форм арабского языка</string>
<string name="preferences_rtl_settings">Поддержка ввода справа налево</string>
<string name="prefs_disconnect_notification">Уведомление об отключении</string>
<string name="activity_type_exercise">Упражнения</string>
@ -617,12 +615,12 @@
<string name="filter_submode_at_least_one">Минимум одно из слов</string>
<string name="filter_submode_all">Все слова</string>
<string name="toast_notification_filter_words_empty_hint">Введите хотя бы одно слово</string>
<string name="debugactivity_really_factoryreset_title">Точно сбросить до заводских настроек\?</string>
<string name="debugactivity_really_factoryreset_title">Сбросить до заводских настроек\?</string>
<string name="filter_mode">Режим фильтрации</string>
<string name="save_configuration">Сохранить конфигурацию</string>
<string name="appwidget_not_connected">Не подключено, будильник не установлено.</string>
<string name="mi2_prefs_button_press_broadcast_default_value" translatable="false">nodomain.freeyourgadget.gadgetbridge.ButtonPressed</string>
<string name="debugactivity_really_factoryreset">Сброс настроек приведёт к удалению всех данных с подключённого устройства (если поддерживается). Устройства Xiaomi / Huami также меняют MAC-адрес Bluetooth, поэтому для Gadgetbridge они отображаются как новые устройства.</string>
<string name="debugactivity_really_factoryreset">Сброс настроек удалит все данные с этого устройства (если поддерживается). Устройства Xiaomi и Huami поменяют MAC-адрес Bluetooth, поэтому в Gadgetbridge они отображаются как новые устройства.</string>
<string name="zetime_date_format_1">ГГ/ММ/ДД</string>
<string name="zetime_date_format_2">ДД/ММ/ГГ</string>
<string name="zetime_date_format_3">ММ/ДД/ГГ</string>
@ -640,7 +638,7 @@
<string name="average">В среднем: %1$s</string>
<string name="pref_summary_expose_hr">Разрешает другим приложениям доступ к датчику сердцебиения при активном соединении через Gadgetbridge</string>
<string name="pref_title_expose_hr">Доступ к пульсометру</string>
<string name="pref_display_add_device_fab">Кнопка подключения новых устройств</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="prefs_button_single_press_action_selection_title">Реакция на Событие 1</string>
@ -648,4 +646,181 @@
<string name="prefs_button_triple_press_action_selection_title">Реакция на Событие 3</string>
<string name="prefs_button_variable_actions">Детальная настройка реакции на нажатие кнопки</string>
<string name="prefs_button_long_press_action_selection_title">Реакция на долгое нажатие</string>
<string name="toast_app_must_not_be_blacklisted">Чтобы настроить приложение, разблокируйте его</string>
<string name="edittext_notification_filter_words_hint">Введите нужные слова по одному в строке</string>
<string name="toast_notification_filter_saved_successfully">Фильтр уведомлений сохранён</string>
<string name="filter_mode_none">Не фильтровать</string>
<string name="filter_mode_whitelist">Показывать, когда слова находятся в списке</string>
<string name="filter_mode_blacklist">Блокировать, когда из списка списке</string>
<string name="mode_configuration">Режим конфигурации</string>
<string name="zetime_title_settings">Настройки ZeTime</string>
<string name="zetime_title_heartrate">Настройки пульса</string>
<string name="zetime_title_screentime">Продолжительность отображения в секундах</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="activity_prefs_alarm_max_heart_rate">Максимальный пульс</string>
<string name="activity_prefs_alarm_min_heart_rate">Минимальный пульс</string>
<string name="zetime_analog_mode">Аналоговый режим</string>
<string name="zetime_analog_mode_hands">Только руки</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_date_format">Формат даты</string>
<string name="zetime_prefs_inactivity_repetitions">Повторения</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_vibrate_once">Вибрировать единожды</string>
<string name="zetime_signaling_vibrate_twice">Вибрировать дважды</string>
<string name="zetime_signaling_beep_once">Сигнализировать единожды</string>
<string name="zetime_signaling_beep_twice">Сигнализировать дважды</string>
<string name="zetime_signaling_vibrate_beep_once">Вибрировать и сигнализировать единожды</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="activity_prefs_calories_burnt">Ежедневная цель: сожженные калории</string>
<string name="activity_prefs_distance_meters">Ежедневная цель: дистанция в метрах</string>
<string name="activity_prefs_activetime_minutes">Ежедневная цель: время активности в минутах</string>
<string name="devicetype_miscale2">Mi Scale 2</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="pref_summary_authkey">Измените ключ авторизации на общий ключ на всех ваших Android-устройствах, с которых вы хотели бы подключиться. Предыдущий ключ по умолчанию для всех устройств 0123456789@ABCDE</string>
<string name="devicetype_bfh16">BFH-16</string>
<string name="fw_upgrade_notice_amazfitcor2">Вы собираетесь установить прошивку %s на ваш Amazfit Cor 2.
\n
\nСоблюдайте последовательность: вначале установите файл .fw, затем .res. После установки файла .fw часы перезагрузятся.
\n
\nОбратите внимание: если версия файла .res совпадает с установленной, его не нужно переустанавливать.
\n
\nВЫ ДЕЙСТВУЕТЕ НА СВОЙ СТРАХ И РИСК!
\n
\nПОЛНОСТЬЮ НЕ ПРОТЕСТИРОВАНО, ВОЗМОЖНО НУЖНО ПРОШИТЬ ПРОШИВКУ BEATS_W, ЕСЛИ ИМЯ ВАШЕГО УСТРОЙСТВА \"Amazfit Band 2\"</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="devicetype_amazfit_cor2">Amazfit Cor 2</string>
<string name="devicetype_miband4">Mi Band 4</string>
<string name="fw_upgrade_notice_miband4">Вы собираетесь установить прошивку %s на ваш Mi Band 4.
\n
\nСоблюдайте последовательность: вначале установите файл .fw, затем .res. После установки файла .fw часы перезагрузятся.
\n
\nОбратите внимание: если версия файла .res совпадает с установленной, его не нужно переустанавливать.
\n
\nВЫ ДЕЙСТВУЕТЕ НА СВОЙ СТРАХ И РИСК!</string>
<string name="prefs_hr_alarm_activity">Сигнал пульсометра в течение занятия спортом</string>
<string name="prefs_hr_alarm_low">Нижний предел</string>
<string name="prefs_hr_alarm_high">Верхний предел</string>
<string name="pref_header_charts">Настройки Графиков</string>
<string name="pref_title_charts_average">Показывать средние значения на графиках</string>
<string name="pref_title_charts_range">Диапазон графиков</string>
<string name="pref_charts_range_on">Диапазон графиков в рамках месяца</string>
<string name="pref_charts_range_off">Диапазон графиков в рамках недели</string>
<string name="weekstepschart_steps_a_month">Шаги за месяц</string>
<string name="weeksleepchart_sleep_a_month">Сон за месяц</string>
<string name="devicetype_mijia_lywsd02">Mijia Smart Clock</string>
<string name="menuitem_nfc">NFC</string>
<string name="pref_title_use_custom_font">Использовать пользовательский шрифт</string>
<string name="pref_summary_use_custom_font">Активируйте это для поддержки emoji, если ваше устройство имеет установленный пользовательский шрифт</string>
<string name="activity_db_management_autoexport_explanation">Местоположение авто-экспорта базы данных установлено:</string>
<string name="activity_db_management_autoexport_label">Авто-экспорт</string>
<string name="activity_DB_ExportButton">Экспорт базы данных</string>
<string name="activity_DB_import_button">Импорт базы данных</string>
<string name="activity_DB_test_export_button">Запустить Авто-экспорт сейчас</string>
<string name="activity_DB_test_export_message">Экспортирование базы данных…</string>
<string name="activity_DB_delete_legacy_button">Удалить старую базу данных</string>
<string name="activity_DB_empty_button">Пустая база данных</string>
<string name="activity_db_management_empty_DB">Пустая база данных</string>
<string name="activity_db_management_exportimport_label">Экспорт и Импорт</string>
<string name="activity_db_management_empty_db_warning">Внимание! Нажав эту кнопку, вы сотрете вашу базу данных и начнете с нуля.</string>
<string name="appwidget_sleep_alarm_widget_label">Сигнализация сна</string>
<string name="widget_steps_label">Шаги: %1$02d</string>
<string name="widget_sleep_label">Сон: %1$s</string>
<string name="widget_listing_label">Статус и будильники</string>
<string name="widget_set_alarm_after">Установить сигнал после:</string>
<string name="widget_5_minutes">5 минут</string>
<string name="widget_10_minutes">10 минут</string>
<string name="widget_20_minutes">20 минут</string>
<string name="widget_1_hour">1 час</string>
<plurals name="widget_alarm_target_hours">
<item quantity="one">час</item>
<item quantity="few">часа</item>
<item quantity="many">часов</item>
</plurals>
<string name="activity_error_no_app_for_gpx">Для просмотра трассировки активности установите приложение, которое может работать с GPX файлами.</string>
<string name="preferences_makibes_hr3_settings">Настройки Makibes HR3</string>
<string name="devicetype_makibes_hr3">Makibes HR3</string>
<string name="devicetype_amazfit_bip_lite">Amazfit Bip Lite</string>
<string name="prefs_find_phone">Найти телефон</string>
<string name="prefs_enable_find_phone">Включить \\\'Найти телефон\\\'</string>
<string name="prefs_find_phone_summary">Использовать ваш браслет для проигрывания рингтонов.</string>
<string name="prefs_find_phone_duration">Продолжительность звонка в секундах</string>
<string name="maximum_duration">Продолжительность</string>
<string name="discovery_need_to_enter_authkey">Это устройство нуждается в ключе авторизации, используйте длительное нажатие на устройство, чтобы войти в него. Читайте Wiki.</string>
<string name="fw_upgrade_notice_amazfitbip_lite">Вы собираетесь установить прошивку %s на ваш Amazfit Bip Lite.
\n
\nБудьте внимательны: сначала установите файл .fw, затем .res. После установки файла .fw часы перезагрузятся.
\n
\nЕсли файл и .res такой же, как в текущей версии, его не нужно переустанавливать.
\n
\nВы действуете на свой страх и риск!</string>
<string name="devicetype_amazfit_gtr">Amazfit GTR</string>
<string name="fw_upgrade_notice_amazfitgtr">Вы собираетесь установить прошивку %s на ваш Amazfit GTR.
\n
\nСоблюдайте последовательность: вначале установите файл .fw, затем .res. После установки файла .fw часы перезагрузятся.
\n
\nОбратите внимание: если версия файла .res совпадает с установленной, его не нужно переустанавливать.
\n
\nВЫ ДЕЙСТВУЕТЕ НА СВОЙ СТРАХ И РИСК!</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="devicetype_amazfit_gts">Amazfit GTS</string>
<string name="fw_upgrade_notice_amazfitgts">Вы собираетесь установить прошивку %s на ваш Amazfit GTS.
\n
\nСоблюдайте последовательность: вначале установите файл .fw, затем .res. После установки файла .fw часы перезагрузятся.
\n
\nОбратите внимание: если версия файла .res совпадает с установленной, его не нужно переустанавливать.
\n
\nВЫ ДЕЙСТВУЕТЕ НА СВОЙ СТРАХ И РИСК!</string>
<string name="devicetype_qhybrid">Fossil Q Hybrid</string>
<string name="preferences_qhybrid_settings">Настройки Q Hybrid</string>
<string name="watch_not_connected">Часы не подсоединены</string>
<string name="qhybrid_vibration_strength">сила вибрации:</string>
<string name="qhybrid_goal_in_steps">Цель в шагах</string>
<string name="qhybrid_time_shift">сдвиг по времени</string>
<string name="qhybrid_second_timezone_offset_relative_to_utc">смещение второго часового пояса относительно UTC</string>
<string name="qhybrid_overwrite_buttons">кнопки перезаписи</string>
<string name="qhybrid_use_activity_hand_as_notification_counter">использовать активную руку в качестве счетчика уведомлений</string>
<string name="qhybrid_prompt_million_steps">Пожалуйста, установите счетчик шагов на миллион, чтобы активировать это.</string>
<string name="qhybrid_buttons_overwrite_success">Кнопки перезаписаны</string>
<string name="qhybrid_buttons_overwrite_error">Ошибка перезаписи кнопок</string>
<string name="qhybrid_offset_timezone">смещение часового пояса на</string>
<string name="qhybrid_changes_delay_prompt">изменения могут занять несколько секунд…</string>
<string name="qhybrid_offset_time_by">смещение часового пояса на</string>
<string name="pref_disable_new_ble_scanning">Отключить новое BLE сканирование</string>
<string name="pref_summary_disable_new_ble_scanning">Включите, если устройство не видно как доступное</string>
<string name="devicetype_banglejs">Bangle.js</string>
<string name="devicetype_y5">Y5</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

@ -823,4 +823,14 @@
<string name="devicetype_itag">iTag</string>
<string name="pref_title_allow_high_mtu">允许高 MTU</string>
<string name="pref_summary_allow_high_mtu">增加传输速度,但是在某些 Android 设备上可能不会工作。</string>
<string name="pref_summary_sync_calendar">即使已经断开连接,也启用日历提醒</string>
<string name="pref_title_sync_caldendar">同步日历事件</string>
<string name="hr_widget_heart_rate">心率</string>
<string name="hr_widget_steps">步数</string>
<string name="hr_widget_date">日期</string>
<string name="hr_widget_active_minutes">活动分钟</string>
<string name="hr_widget_calories">卡路里</string>
<string name="hr_widget_battery">电池</string>
<string name="hr_widget_weather">天气</string>
<string name="hr_widget_nothing"></string>
</resources>

View File

@ -182,6 +182,8 @@
<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_summary_sync_calendar">Enables calendar alerts, even when disconnected</string>
<string name="pref_title_sync_caldendar">Sync calendar events</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>
@ -494,6 +496,8 @@
<string name="mi3_prefs_band_screen_unlock_summary">Swipe up to unlock the band\'s screen</string>
<string name="mi3_prefs_night_mode">Night mode</string>
<string name="mi3_prefs_night_mode_summary">Lower band screen brightness automatically at night</string>
<string name="pref_title_force_white_color_scheme">Force black on white color scheme</string>
<string name="pref_summary_force_white_color_scheme">Useful if you your watch has dark hands</string>
<string name="automatic">Automatic</string>
<string name="simplified_chinese">Simplified Chinese</string>
<string name="traditional_chinese">Traditional Chinese</string>
@ -608,6 +612,7 @@
<string name="activity_web_view">Web View Activity</string>
<string name="StringUtils_sender"> (%1$s)</string>
<string name="find_device_you_found_it">You found it!</string>
<string name="find_lost_device_you_found_it">Found it!</string>
<string name="miband2_prefs_timeformat">Mi2: Time format</string>
<string name="mi2_fw_installhandler_fw53_hint">You need to install version %1$s before installing this firmware!</string>
<string name="mi2_enable_text_notifications">Text notifications</string>
@ -782,6 +787,7 @@
<string name="hr_widget_active_minutes">Active minutes</string>
<string name="hr_widget_calories">Calories</string>
<string name="hr_widget_battery">Battery</string>
<string name="hr_widget_weather">Weather</string>
<string name="hr_widget_nothing">Nothing</string>
<string name="prefs_button_single_press_action_selection_title">Event 1 action</string>

View File

@ -1,5 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<changelog>
<release version="0.42.1" versioncode="168">
<change>Fix accepting/rejecting calls on Android 9</change>
<change>Mi Band 3/4, Amazfit Bip/Cor/GTS/GTR: Option to sync calender events as reminder</change>
</release>
<release version="0.42.0" versioncode="167">
<change>Initial iTag support</change>
<change>Fix indefinitely lasting bluetooth scans when location permission has not been granted</change>

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="force_white_color_scheme"
android:summary="@string/pref_summary_force_white_color_scheme"
android:title="@string/pref_title_force_white_color_scheme" />
</androidx.preference.PreferenceScreen>

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="sync_calendar"
android:summary="@string/pref_summary_sync_calendar"
android:title="@string/pref_title_sync_caldendar" />
</androidx.preference.PreferenceScreen>

View File

@ -9,7 +9,7 @@ buildscript {
}
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.3'
classpath 'com.android.tools.build:gradle:3.6.0'
classpath "gradle.plugin.com.github.spotbugs:spotbugs-gradle-plugin:2.0.0"
// NOTE: Do not place your application dependencies here; they belong

View File

@ -0,0 +1,2 @@
* Fix accepting/rejecting calls on Android 9
* Mi Band 3/4, Amazfit Bip/Cor/GTS/GTR: Option to sync calender events as reminder

View File

@ -1,6 +1,6 @@
#Mon Sep 16 21:26:43 CEST 2019
#Thu Feb 27 12:28:03 CET 2020
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip