diff --git a/app/build.gradle b/app/build.gradle
index 99f75893c2..c28da624bb 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -369,9 +369,12 @@ dependencies {
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0', {
exclude group: 'com.android.support', module: 'support-annotations'
}
- androidTestImplementation 'androidx.test.ext:junit:1.1.1', {
+ androidTestImplementation 'androidx.test.ext:junit:1.1.5', {
exclude group: 'com.android.support', module: 'support-annotations'
}
+ androidTestImplementation 'androidx.test:rules:1.2.0'
+ androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'
+ androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.1.0'
androidTestImplementation 'androidx.test.espresso:espresso-idling-resource:3.1.0'
// add this for intent mocking support
//androidTestImplementation 'com.android.support.test.espresso:espresso-intents:3.0.1'
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
index ebbec48de7..f447b1aa5c 100644
--- a/app/proguard-rules.pro
+++ b/app/proguard-rules.pro
@@ -64,6 +64,21 @@
-keep class android.support.v7.widget.SearchView { *; }
-keep class kotlinx.serialization.Serializable { *; }
+# As long as we only deserialize (from a JSON string into an `NSDeviceStatus`
+# object in the class `AAPSStatusHandler`) we can simply ignore warnings related
+# to kotlinx serialization.
+# These rule should not cause problems: if a project actually relies on
+# serialization, then much more than just this class will be required,
+# so telling Proguard not to worry if this is missing will not prevent it
+# from emitting errors for code that does use serialization but somehow forgot
+# to depend on it.
+-dontwarn kotlinx.serialization.Serializable
+
+# The lib net.sf.kxml:kxml2:2.3.0 is referenced in same required libraries used for
+# Android testing. R8 is showing missing classes warnings which can be safely ignored.
+-dontwarn org.kxml2.io.KXmlParser
+-dontwarn org.kxml2.io.KXmlSerializer
+
-dontwarn java.util.concurrent.**
-keep class rx.schedulers.Schedulers {
diff --git a/app/src/androidTest/java/com/eveningoutpost/dexdrip/HomeEspressoTest.java b/app/src/androidTest/java/com/eveningoutpost/dexdrip/HomeEspressoTest.java
index 0456ea66e0..3159bfe434 100644
--- a/app/src/androidTest/java/com/eveningoutpost/dexdrip/HomeEspressoTest.java
+++ b/app/src/androidTest/java/com/eveningoutpost/dexdrip/HomeEspressoTest.java
@@ -5,15 +5,28 @@
*/
+import static androidx.test.espresso.Espresso.onView;
+import static androidx.test.espresso.action.ViewActions.click;
+import static androidx.test.espresso.assertion.ViewAssertions.matches;
+import static androidx.test.espresso.matcher.RootMatchers.isDialog;
+import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
+import static androidx.test.espresso.matcher.ViewMatchers.withId;
+import static androidx.test.espresso.matcher.ViewMatchers.withText;
+import static com.schibsted.spain.barista.BaristaClickActions.click;
+import static com.schibsted.spain.barista.BaristaScrollActions.scrollTo;
+import static com.schibsted.spain.barista.custom.NestedEnabledScrollToAction.scrollTo;
+import static org.hamcrest.core.AllOf.allOf;
+
import android.app.Activity;
import android.content.Context;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.annotation.UiThreadTest;
-import android.support.test.espresso.ViewInteraction;
-import android.support.test.rule.ActivityTestRule;
-import android.support.test.runner.AndroidJUnit4;
import android.view.WindowManager;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.espresso.ViewInteraction;
+import androidx.test.rule.ActivityTestRule;
+import androidx.test.runner.AndroidJUnit4;
+
import com.schibsted.spain.barista.flakyespresso.AllowFlaky;
import org.junit.After;
@@ -26,18 +39,6 @@
import java.io.File;
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.action.ViewActions.click;
-import static android.support.test.espresso.assertion.ViewAssertions.matches;
-import static android.support.test.espresso.matcher.RootMatchers.isDialog;
-import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
-import static android.support.test.espresso.matcher.ViewMatchers.withId;
-import static android.support.test.espresso.matcher.ViewMatchers.withText;
-import static com.schibsted.spain.barista.BaristaClickActions.click;
-import static com.schibsted.spain.barista.BaristaScrollActions.scrollTo;
-import static com.schibsted.spain.barista.custom.NestedEnabledScrollToAction.scrollTo;
-import static org.hamcrest.core.AllOf.allOf;
-
@RunWith(AndroidJUnit4.class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class HomeEspressoTest {
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 73df543f1f..35e672da9d 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -703,6 +703,12 @@
+
+ 200000) {
+ if (builder.length() > MAX_LOG_PACKAGE_SIZE) {
JoH.static_toast_long(this, "Could not package up all logs, using most recent");
+ builder.append("\n\nOnly the most recent logs have been included to limit the file size.\n");
break;
}
}
- startActivity(new Intent(getApplicationContext(), SendFeedBack.class).putExtra("generic_text", builder.toString()));
+
+ builder.insert(0, JoH.getDeviceDetails() + "\n" + JoH.getVersionDetails() + "\n" + getBestCollectorHardwareName() + "\n===\n" + "\nLog data:\n"); // Adds device, version and collector details before the log.
+ builder.append("\n\nCaptured: " + JoH.dateTimeText(JoH.tsl())); // Adds date and time of capture after the log.
+
+ return builder.toString();
}
// View model container - accessible binding methods must be declared public
@@ -636,5 +651,3 @@ public void onBindBinding(ViewDataBinding binding, int bindingVariable, @LayoutR
}
}
-
-
diff --git a/app/src/main/java/com/eveningoutpost/dexdrip/GcmActivity.java b/app/src/main/java/com/eveningoutpost/dexdrip/GcmActivity.java
index 447dfef44f..be2e219f6e 100644
--- a/app/src/main/java/com/eveningoutpost/dexdrip/GcmActivity.java
+++ b/app/src/main/java/com/eveningoutpost/dexdrip/GcmActivity.java
@@ -16,6 +16,7 @@
import android.widget.Toast;
+import com.eveningoutpost.dexdrip.cloud.jamcm.JamCm;
import com.eveningoutpost.dexdrip.models.BgReading;
import com.eveningoutpost.dexdrip.models.BloodTest;
import com.eveningoutpost.dexdrip.models.Calibration;
@@ -216,7 +217,8 @@ private static void queueCheckOld(Context context, boolean recursive) {
try {
Log.i(TAG, "Resending unacknowledged queue item: " + datum.bundle.getString("action") + datum.bundle.getString("payload"));
datum.resent++;
- GoogleCloudMessaging.getInstance(context).send(senderid + "@gcm.googleapis.com", Integer.toString(msgId.incrementAndGet()), datum.bundle);
+ // GoogleCloudMessaging.getInstance(context).send(senderid + "@gcm.googleapis.com", Integer.toString(msgId.incrementAndGet()), datum.bundle);
+ JamCm.sendMessage(datum.bundle);
} catch (Exception e) {
Log.e(TAG, "Got exception during resend: " + e.toString());
}
@@ -650,7 +652,7 @@ public static void push_external_status_update(long timestamp, String statusLine
}
}
- static String myIdentity() {
+ public static String myIdentity() {
// TODO prefs override possible
return GoogleDriveInterface.getDriveIdentityString();
}
@@ -762,19 +764,20 @@ private static synchronized String sendMessageNow(String identity, String action
Log.e(TAG, "Queue size exceeded");
Home.toaststaticnext("Maximum Sync Queue size Exceeded!");
}
- final GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(xdrip.getAppContext());
+ // final GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(xdrip.getAppContext());
if (token == null) {
Log.e(TAG, "GCM token is null - cannot sendMessage");
return "";
}
String messageid = Integer.toString(msgId.incrementAndGet());
- gcm.send(senderid + "@gcm.googleapis.com", messageid, data);
+ // gcm.send(senderid + "@gcm.googleapis.com", messageid, data);
if (last_ack == -1) last_ack = JoH.tsl();
last_send_previous = last_send;
last_send = JoH.tsl();
+ JamCm.sendMessage(data);
msg = "Sent message OK " + messageid;
DesertSync.fromGCM(data);
- } catch (IOException ex) {
+ } catch (Exception ex) {
msg = "Error :" + ex.getMessage();
}
Log.d(TAG, "Return msg in SendMessage: " + msg);
diff --git a/app/src/main/java/com/eveningoutpost/dexdrip/GcmListenerSvc.java b/app/src/main/java/com/eveningoutpost/dexdrip/GcmListenerSvc.java
index 0e2211199d..8e526d4cf6 100644
--- a/app/src/main/java/com/eveningoutpost/dexdrip/GcmListenerSvc.java
+++ b/app/src/main/java/com/eveningoutpost/dexdrip/GcmListenerSvc.java
@@ -16,6 +16,7 @@
import android.os.PowerManager;
import android.util.Base64;
+import com.eveningoutpost.dexdrip.cloud.jamcm.JamCm;
import com.eveningoutpost.dexdrip.models.BgReading;
import com.eveningoutpost.dexdrip.models.BloodTest;
import com.eveningoutpost.dexdrip.models.Calibration;
@@ -167,8 +168,7 @@ public void onMessageReceived(RemoteMessage rmessage) {
String xfrom = data.getString("xfrom");
String payload = data.getString("datum", data.getString("payload"));
String action = data.getString("action");
-
- if ((xfrom != null) && (xfrom.equals(GcmActivity.token))) {
+ if ((xfrom != null) && (xfrom.equals(GcmActivity.token) || xfrom.equals(JamCm.getId()))) {
GcmActivity.queueAction(action + payload);
return;
}
diff --git a/app/src/main/java/com/eveningoutpost/dexdrip/Home.java b/app/src/main/java/com/eveningoutpost/dexdrip/Home.java
index 75ec69b26e..d94d922ad7 100644
--- a/app/src/main/java/com/eveningoutpost/dexdrip/Home.java
+++ b/app/src/main/java/com/eveningoutpost/dexdrip/Home.java
@@ -70,6 +70,7 @@
import android.widget.TextView;
import android.widget.Toast;
+import com.eveningoutpost.dexdrip.g5model.DexSyncKeeper;
import com.eveningoutpost.dexdrip.g5model.DexTimeKeeper;
import com.eveningoutpost.dexdrip.g5model.Ob1G5StateMachine;
import com.eveningoutpost.dexdrip.g5model.SensorDays;
@@ -645,7 +646,7 @@ private boolean checkBatteryOptimization() {
Log.d(TAG, "Requesting ignore battery optimization");
if (((dialog == null) || (!dialog.isShowing()))
- && (PersistentStore.incrementLong("asked_battery_optimization") < 40)) {
+ && (PersistentStore.incrementLong("asked_battery_optimization") < 40000)) {
JoH.show_ok_dialog(this, gs(R.string.please_allow_permission), gs(R.string.xdrip_needs_whitelisting_for_proper_performance), new Runnable() {
@RequiresApi(api = Build.VERSION_CODES.M)
@@ -1912,7 +1913,7 @@ public void onReceive(Context ctx, Intent intent) {
NFControl.initNFC(this, false);
if (get_follower() || get_master()) {
- GcmActivity.checkSync(this);
+ // GcmActivity.checkSync(this);
}
checkWifiSleepPolicy();
@@ -2630,11 +2631,11 @@ private void updateCurrentBgInfoCommon(DexCollectionType collector, TextView not
}
if (!isSensorActive) {
- // Define a variable (notConnectedToG6Yet) that is only true if Native G6 is chosen, but, transmitter days is unknown.
- boolean notConnectedToG6Yet = DexCollectionType.getDexCollectionType() == DexcomG5 && Pref.getBooleanDefaultFalse("ob1_g5_use_transmitter_alg") && Pref.getBooleanDefaultFalse("using_g6") && DexTimeKeeper.getTransmitterAgeInDays(getTransmitterID()) == -1;
- if (notConnectedToG6Yet || shortTxId()) { // Only if G6 has been selected and transmitter days is unknown, or if G7 has been selected.
+ // Define a variable (notConnectedToG6Yet) that is only true if Native G6 is chosen, but, transmitter days is unknown or not synced yet.
+ boolean notConnectedToG6Yet = DexCollectionType.getDexCollectionType() == DexcomG5 && Pref.getBooleanDefaultFalse("ob1_g5_use_transmitter_alg") && Pref.getBooleanDefaultFalse("using_g6") && (DexTimeKeeper.getTransmitterAgeInDays(getTransmitterID()) == -1 || !DexSyncKeeper.isReady(getTransmitterID()));
+ if (notConnectedToG6Yet || shortTxId()) { // Only if G6 has been selected and transmitter is not synced yet, or if G7 has been selected.
notificationText.setText(R.string.wait_to_connect);
- } else { // Only if G6 is not selected or G6 transmitter days is known.
+ } else { // Only if G6 is not selected or G6 transmitter is synced.
notificationText.setText(R.string.now_start_your_sensor);
}
@@ -2653,7 +2654,7 @@ private void updateCurrentBgInfoCommon(DexCollectionType collector, TextView not
dialog.show();
} else {
if (!Experience.gotData() && !QuickSettingsDialogs.isDialogShowing() && !notConnectedToG6Yet && JoH.ratelimit("start-sensor_prompt", 20)) {
- // Show the dialog only if there is no data, and there is no dialog, and G6 is not selected or G6 is connected, and the rate limit is satisfied.
+ // Show the start sensor prompt only if G6 is not selected or the G6 transmitter is synchronized.
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
final Context context = this;
builder.setTitle(getString(R.string.start_sensor) + "?");
diff --git a/app/src/main/java/com/eveningoutpost/dexdrip/MegaStatus.java b/app/src/main/java/com/eveningoutpost/dexdrip/MegaStatus.java
index de93a3a4cc..a985fe6ac4 100644
--- a/app/src/main/java/com/eveningoutpost/dexdrip/MegaStatus.java
+++ b/app/src/main/java/com/eveningoutpost/dexdrip/MegaStatus.java
@@ -119,7 +119,7 @@ private void addAsection(String section, String title) {
}
private static final String G4_STATUS = "BT Device";
- public static final String G5_STATUS = "G5/G6/G7 Status";
+ public static final String G5_STATUS = "Dex Status";
private static final String MEDTRUM_STATUS = "Medtrum Status";
private static final String IP_COLLECTOR = "IP Collector";
private static final String XDRIP_PLUS_SYNC = "Followers";
@@ -168,7 +168,7 @@ private void populateSectionList() {
}
if (dexCollectionType.equals(DexcomG5)) {
if (Pref.getBooleanDefaultFalse(Ob1G5CollectionService.OB1G5_PREFS)) {
- addAsection(G5_STATUS, "OB1 G5/G6/G7 Collector and Transmitter Status");
+ addAsection(G5_STATUS, "G6/Dex1/G7/1+ Collector/Transmitter Status");
} else {
addAsection(G5_STATUS, "G5 Collector and Transmitter Status");
}
diff --git a/app/src/main/java/com/eveningoutpost/dexdrip/NavDrawerBuilder.java b/app/src/main/java/com/eveningoutpost/dexdrip/NavDrawerBuilder.java
index f8fcca76d7..daf241c321 100644
--- a/app/src/main/java/com/eveningoutpost/dexdrip/NavDrawerBuilder.java
+++ b/app/src/main/java/com/eveningoutpost/dexdrip/NavDrawerBuilder.java
@@ -18,7 +18,6 @@
import com.eveningoutpost.dexdrip.utilitymodels.CollectionServiceStarter;
import com.eveningoutpost.dexdrip.utilitymodels.Experience;
import com.eveningoutpost.dexdrip.stats.StatsActivity;
-import com.eveningoutpost.dexdrip.utilitymodels.Pref;
import com.eveningoutpost.dexdrip.utils.DexCollectionType;
import com.eveningoutpost.dexdrip.utils.Preferences;
@@ -103,7 +102,7 @@ public NavDrawerBuilder(final Context context) {
}
}
}
- if (!getBestCollectorHardwareName().equals("G7") || Pref.getBooleanDefaultFalse("engineering_mode")) { // If we are using G7, offer the stop sensor option in engineering mode only
+ if (!getBestCollectorHardwareName().equals("G7")) { // If we are using G7, there will be no stop sensor option in the menu.
this.nav_drawer_options.add(context.getString(R.string.stop_sensor));
this.nav_drawer_intents.add(new Intent(context, StopSensor.class));
}
diff --git a/app/src/main/java/com/eveningoutpost/dexdrip/alert/SensorExpiry.java b/app/src/main/java/com/eveningoutpost/dexdrip/alert/SensorExpiry.java
index dcd1f455d0..f7271a52c7 100644
--- a/app/src/main/java/com/eveningoutpost/dexdrip/alert/SensorExpiry.java
+++ b/app/src/main/java/com/eveningoutpost/dexdrip/alert/SensorExpiry.java
@@ -41,7 +41,7 @@ public SensorExpiry() {
@Override
public boolean activate() {
- val expiry = niceTimeScalarNatural(SensorDays.get().getRemainingSensorPeriodInMs());
+ val expiry = niceTimeScalarNatural(SensorDays.get().getRemainingSensorPeriodInMs(), 1);
val notificationId = SENSORY_EXPIRY_NOTIFICATION_ID;
cancelNotification(notificationId);
val expireMsg = String.format("Sensor will expire in %s", expiry); // TODO i18n and format string
diff --git a/app/src/main/java/com/eveningoutpost/dexdrip/cloud/jamcm/JamCm.java b/app/src/main/java/com/eveningoutpost/dexdrip/cloud/jamcm/JamCm.java
new file mode 100644
index 0000000000..0162ff2d77
--- /dev/null
+++ b/app/src/main/java/com/eveningoutpost/dexdrip/cloud/jamcm/JamCm.java
@@ -0,0 +1,103 @@
+package com.eveningoutpost.dexdrip.cloud.jamcm;
+
+import static com.eveningoutpost.dexdrip.utils.CipherUtils.hexToBytes;
+
+import android.os.Bundle;
+
+import com.eveningoutpost.dexdrip.GcmActivity;
+import com.eveningoutpost.dexdrip.models.JoH;
+import com.eveningoutpost.dexdrip.models.UserError;
+import com.eveningoutpost.dexdrip.utils.CipherUtils;
+
+import java.net.DatagramPacket;
+import java.net.DatagramSocket;
+import java.net.InetAddress;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.charset.StandardCharsets;
+
+import lombok.val;
+
+/**
+ * JamOrHam
+ *
+ * Replacement for GCM
+ */
+public class JamCm {
+
+ private static final String TAG = "JamCm";
+ private static final String serverInstance = "jamcm3749021";
+ private static final String serverDomain = "bluejay.website";
+ private static final String serverAddress = serverInstance + "." + serverDomain;
+ private static final int serverPort = 5228;
+
+ private static final byte PROTOCOL_VERSION = 1;
+
+ /**
+ * @noinspection DataFlowIssue
+ */
+ public static String getId() {
+ if (GcmActivity.token == null) {
+ return null;
+ }
+ try {
+ return CipherUtils.getSHA256(GcmActivity.token).substring(0, 32);
+ } catch (Exception e) {
+ UserError.Log.wtf(TAG, "Got exception in getId: " + e);
+ return null;
+ }
+ }
+
+ /**
+ * @noinspection DataFlowIssue
+ */
+ public static void sendMessage(Bundle input) {
+
+ val ids = getId();
+ if (ids == null) {
+ if (JoH.ratelimit("sendMessage error", 1200)) {
+ UserError.Log.wtf(TAG, "Cannot send message due to missing id");
+ }
+ return;
+ }
+ try {
+ UserError.Log.d(TAG, "sendMessage called");
+ InetAddress address = InetAddress.getByName(serverAddress);
+
+ byte[] id = hexToBytes(ids);
+ if (id.length != 16) {
+ throw new RuntimeException("Invalid id length: " + id.length);
+ }
+ byte[] channel = GcmActivity.myIdentity().getBytes(StandardCharsets.UTF_8);
+ if (channel.length != 32) {
+ throw new RuntimeException("Invalid channel length: " + channel.length);
+ }
+
+ byte[] type = new byte[16];
+ byte[] actionb = input.getString("action").getBytes(StandardCharsets.UTF_8);
+ System.arraycopy(actionb, 0, type, 0, Math.min(type.length, actionb.length));
+ byte[] payload = input.getString("payload").getBytes(StandardCharsets.UTF_8);
+ short messageSize = (short) payload.length;
+
+ val buffer = ByteBuffer.allocate(1 + 16 + 32 + 16 + 2 + payload.length);
+ buffer.order(ByteOrder.LITTLE_ENDIAN);
+ buffer.put(PROTOCOL_VERSION);
+ buffer.put(id);
+ buffer.put(channel);
+ buffer.put(type);
+ buffer.putShort(messageSize);
+ buffer.put(payload);
+
+ val data = buffer.array();
+ val packet = new DatagramPacket(data, data.length, address, serverPort);
+
+ try (DatagramSocket socket = new DatagramSocket()) {
+ socket.send(packet);
+ UserError.Log.d(TAG, "Message sent to server");
+ }
+ } catch (Exception e) {
+ UserError.Log.e(TAG, "Error: " + e);
+ }
+ }
+
+}
diff --git a/app/src/main/java/com/eveningoutpost/dexdrip/g5model/CalibrationState.java b/app/src/main/java/com/eveningoutpost/dexdrip/g5model/CalibrationState.java
index fb5a960f5b..32299e6b26 100644
--- a/app/src/main/java/com/eveningoutpost/dexdrip/g5model/CalibrationState.java
+++ b/app/src/main/java/com/eveningoutpost/dexdrip/g5model/CalibrationState.java
@@ -40,7 +40,7 @@ public enum CalibrationState {
SensorFailedStart(0x16, "Sensor Failed Start"),
SensorFailedStart2(0x17, "Sensor Failed Start 2"),
SensorExpired(0x18, "Sensor Expired"),
- SensorFailed7(0x19, "Sensor Failed 7"),
+ SensorFailed7(0x19, "Sensor Failed 7"), // apparently not a failure state
SensorStopped2(0x1A, "Sensor Stopped 2"),
SensorFailed8(0x1B, "Sensor Failed 8"),
SensorFailed9(0x1C, "Sensor Failed 9"),
@@ -58,7 +58,7 @@ public enum CalibrationState {
private static final SparseArray lookup = new SparseArray<>();
private static final ImmutableSet failed = ImmutableSet.of(SensorFailed, SensorFailed2, SensorFailed3, SensorFailed4, SensorFailed5, SensorFailed6, SensorFailedStart);
- private static final ImmutableSet stopped = ImmutableSet.of(Stopped, Ended, SensorFailed, SensorFailed2, SensorFailed3, SensorFailed4, SensorFailed5, SensorFailed6, SensorFailedStart, SensorStopped);
+ private static final ImmutableSet stopped = ImmutableSet.of(Stopped, Ended, SensorExpired, SensorFailed, SensorFailed2, SensorFailed3, SensorFailed4, SensorFailed5, SensorFailed6, SensorFailedStart, SensorStopped);
private static final ImmutableSet transitional = ImmutableSet.of(WarmingUp, SensorStarted, SensorStopped, CalibrationSent);
@@ -85,7 +85,8 @@ public static CalibrationState parse(int state) {
public boolean usableGlucose() {
return this == Ok
- || this == NeedsCalibration;
+ || this == NeedsCalibration
+ || this == SensorFailed7;
}
public boolean insufficientCalibration() {
diff --git a/app/src/main/java/com/eveningoutpost/dexdrip/g5model/Ob1G5StateMachine.java b/app/src/main/java/com/eveningoutpost/dexdrip/g5model/Ob1G5StateMachine.java
index 1488d74b7c..5992a73a18 100644
--- a/app/src/main/java/com/eveningoutpost/dexdrip/g5model/Ob1G5StateMachine.java
+++ b/app/src/main/java/com/eveningoutpost/dexdrip/g5model/Ob1G5StateMachine.java
@@ -92,6 +92,7 @@
import static com.eveningoutpost.dexdrip.utilitymodels.Constants.HOUR_IN_MS;
import static com.eveningoutpost.dexdrip.utilitymodels.Constants.MINUTE_IN_MS;
import static com.eveningoutpost.dexdrip.utilitymodels.Constants.SECOND_IN_MS;
+import static com.eveningoutpost.dexdrip.utils.DexCollectionType.getBestCollectorHardwareName;
import static com.eveningoutpost.dexdrip.utils.bt.Helper.getStatusName;
@@ -133,6 +134,7 @@ public class Ob1G5StateMachine {
private static volatile AuthRequestTxMessage lastAuthPacket;
private static volatile boolean backup_loaded = false;
private static final int OLDEST_RAW = 300 * 24 * 60 * 60; // 300 days
+ private static long relAutoSessionStartTime = HOUR_IN_MS * 3;
public static long maxBackfillPeriod_MS = 0;
@@ -1550,14 +1552,19 @@ private static void processQueueCommand(Ob1G5CollectionService parent, RxBleConn
}
private static void checkAndActivateSensor() {
- // automagically start an xDrip sensor session if transmitter already has active sensor
+ // automagically start an xDrip sensor session if transmitter already has active sensor
if (!Sensor.isActive() && Ob1G5CollectionService.isG5SensorStarted() && (!Sensor.stoppedRecently() || shortTxId())) {
JoH.static_toast_long(xdrip.gs(R.string.auto_starting_sensor));
- // TODO possibly here we want to look at last sensor stop time and not backtrack before that
- Sensor.create(tsl() - HOUR_IN_MS * 3);
- if (shortTxId()) { // If we are using G7
- Sensor.create(tsl() - HOUR_IN_MS * 24);
+ if (shortTxId()) relAutoSessionStartTime = HOUR_IN_MS * 24; // If we are using a G7
+ final List last = BgReading.latest(1); // Last reading
+ if ((last != null) && (last.size() > 0)) { // Have we had a reading?
+ final long now = JoH.tsl();
+ final long since = now - last.get(0).timestamp; // Time since last reading
+ if (since < relAutoSessionStartTime) { // If the last reading was less than 3 hours ago, or if we are using G7 and the last reading was less than 24 hours ago
+ relAutoSessionStartTime = since; // We will start the new session starting from the last reading.
+ }
}
+ Sensor.create(tsl() - relAutoSessionStartTime);
}
}
diff --git a/app/src/main/java/com/eveningoutpost/dexdrip/models/JoH.java b/app/src/main/java/com/eveningoutpost/dexdrip/models/JoH.java
index 584cea0e38..84114994d1 100644
--- a/app/src/main/java/com/eveningoutpost/dexdrip/models/JoH.java
+++ b/app/src/main/java/com/eveningoutpost/dexdrip/models/JoH.java
@@ -809,14 +809,18 @@ public static String niceTimeScalar(double t, int digits) {
}
- public static String niceTimeScalarNatural(long t) {
+ public static String niceTimeScalarNatural(long t) { // Shows the integer part only when less than 1 day.
+ return niceTimeScalarNatural(t, 0);
+ }
+
+ public static String niceTimeScalarNatural(long t, int h_digits) { // Rounds down to the defined number of decimal points when less than 1 day.
if (t > 3000000) t = t + 10000; // round up by 10 seconds if nearly an hour
if ((t > Constants.DAY_IN_MS) && (t < Constants.WEEK_IN_MS * 2)) {
final SimpleDateFormat df = new SimpleDateFormat("EEEE", Locale.getDefault());
final String day = df.format(new Date(JoH.tsl() + t));
return ((t > Constants.WEEK_IN_MS) ? "next " : "") + day;
} else {
- return niceTimeScalar(t);
+ return niceTimeScalar(t, h_digits);
}
}
diff --git a/app/src/main/java/com/eveningoutpost/dexdrip/models/LibreOOPAlgorithm.java b/app/src/main/java/com/eveningoutpost/dexdrip/models/LibreOOPAlgorithm.java
index c6ed86d0fa..f5d51c8cab 100644
--- a/app/src/main/java/com/eveningoutpost/dexdrip/models/LibreOOPAlgorithm.java
+++ b/app/src/main/java/com/eveningoutpost/dexdrip/models/LibreOOPAlgorithm.java
@@ -303,6 +303,7 @@ public static SensorType getSensorType(byte[] SensorInfo) {
return SensorType.LibreUS14Day;
case 0x9d0830:
case 0xc50930:
+ case 0xc60931:
return SensorType.Libre2;
case 0x700010:
return SensorType.LibreProH;
diff --git a/app/src/main/java/com/eveningoutpost/dexdrip/services/Ob1G5CollectionService.java b/app/src/main/java/com/eveningoutpost/dexdrip/services/Ob1G5CollectionService.java
index 70a6702cd9..ccfa545f5e 100644
--- a/app/src/main/java/com/eveningoutpost/dexdrip/services/Ob1G5CollectionService.java
+++ b/app/src/main/java/com/eveningoutpost/dexdrip/services/Ob1G5CollectionService.java
@@ -1153,7 +1153,7 @@ public int onStartCommand(Intent intent, int flags, int startId) {
}
minimize_scanning = Pref.getBooleanDefaultFalse("ob1_minimize_scanning");
- // allow_scan_by_mac = Build.VERSION.SDK_INT >= 32 && shortTxId();
+ // allow_scan_by_mac = Build.VERSION.SDK_INT >= 32 && shortTxId();
automata(); // sequence logic
UserError.Log.d(TAG, "Releasing service start");
@@ -1785,7 +1785,7 @@ public void instantCreateBondIfAllowed() {
private boolean getInitiateBondingFlag() {
- return Pref.getBoolean("ob1_initiate_bonding_flag", true);
+ return true; // There is no reason not to initiate bonding
}
diff --git a/app/src/main/java/com/eveningoutpost/dexdrip/services/UiBasedCollector.java b/app/src/main/java/com/eveningoutpost/dexdrip/services/UiBasedCollector.java
index 01383d195a..3427239f87 100644
--- a/app/src/main/java/com/eveningoutpost/dexdrip/services/UiBasedCollector.java
+++ b/app/src/main/java/com/eveningoutpost/dexdrip/services/UiBasedCollector.java
@@ -91,6 +91,7 @@ public class UiBasedCollector extends NotificationListenerService {
coOptedPackages.add("com.medtronic.diabetes.simplera.eu");
coOptedPackages.add("com.senseonics.gen12androidapp");
coOptedPackages.add("com.senseonics.androidapp");
+ coOptedPackages.add("com.microtech.aidexx.mgdl"); // Experiment
coOptedPackagesAll.add("com.dexcom.dexcomone");
coOptedPackagesAll.add("com.dexcom.d1plus");
@@ -98,6 +99,7 @@ public class UiBasedCollector extends NotificationListenerService {
coOptedPackagesAll.add("com.medtronic.diabetes.simplera.eu");
coOptedPackagesAll.add("com.senseonics.gen12androidapp");
coOptedPackagesAll.add("com.senseonics.androidapp");
+ coOptedPackagesAll.add("com.microtech.aidexx.mgdl"); // Experiment
companionAppIoBPackages.add("com.insulet.myblue.pdm");
diff --git a/app/src/main/java/com/eveningoutpost/dexdrip/tables/BgReadingTable.java b/app/src/main/java/com/eveningoutpost/dexdrip/tables/BgReadingTable.java
index a3ffaa759d..9c7b6f3917 100644
--- a/app/src/main/java/com/eveningoutpost/dexdrip/tables/BgReadingTable.java
+++ b/app/src/main/java/com/eveningoutpost/dexdrip/tables/BgReadingTable.java
@@ -62,10 +62,10 @@ public void onNavigationDrawerItemSelected(int position) {
private void getData() {
final List latest = BgReading.latest(5000);
- parseDataForStats(latest);
- ListAdapter adapter = new BgReadingAdapter(this, latest);
- this.setListAdapter(adapter);
try {
+ parseDataForStats(latest);
+ ListAdapter adapter = new BgReadingAdapter(this, latest);
+ this.setListAdapter(adapter);
if (total > 0) {
this.getActionBar().setSubtitle(String.format(Locale.getDefault(), "%d in 24h, bf:%d%% mis:%d", total, ((backfilled * 100) / total), missing));
}
diff --git a/app/src/main/java/com/eveningoutpost/dexdrip/utilitymodels/CompatibleApps.java b/app/src/main/java/com/eveningoutpost/dexdrip/utilitymodels/CompatibleApps.java
index 50d4a43e4a..9233195ff0 100644
--- a/app/src/main/java/com/eveningoutpost/dexdrip/utilitymodels/CompatibleApps.java
+++ b/app/src/main/java/com/eveningoutpost/dexdrip/utilitymodels/CompatibleApps.java
@@ -173,7 +173,7 @@ private static int notify(String short_name, String msg, int id, Feature action)
public static void showNotification(String title, String content, PendingIntent yesIntent, PendingIntent noIntent, PendingIntent contentIntent, int notificationId) {
- final NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(xdrip.getAppContext(), null)
+ final NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(xdrip.getAppContext(), (String)null)
.setSmallIcon(R.drawable.ic_action_communication_invert_colors_on)
.setContentTitle(title)
.setContentText(content)
diff --git a/app/src/main/java/com/eveningoutpost/dexdrip/utilitymodels/Constants.java b/app/src/main/java/com/eveningoutpost/dexdrip/utilitymodels/Constants.java
index 160d9e8346..49cd91fc46 100644
--- a/app/src/main/java/com/eveningoutpost/dexdrip/utilitymodels/Constants.java
+++ b/app/src/main/java/com/eveningoutpost/dexdrip/utilitymodels/Constants.java
@@ -58,6 +58,8 @@ public class Constants {
static final int NIGHTSCOUT_ERROR_NOTIFICATION_ID = 2001;
public static final int HEALTH_CONNECT_RESPONSE_ID = 2002;
+ public static final int ZXING_CAM_REQ_CODE = 49374;
+ public static final int ZXING_FILE_REQ_CODE = 49375; // This is created by just incrementing the existing camera scan code from the zxing package
public static final int SENSORY_EXPIRY_NOTIFICATION_ID = 2003;
diff --git a/app/src/main/java/com/eveningoutpost/dexdrip/utilitymodels/IdempotentMigrations.java b/app/src/main/java/com/eveningoutpost/dexdrip/utilitymodels/IdempotentMigrations.java
index 9344057bce..65c0c5776a 100644
--- a/app/src/main/java/com/eveningoutpost/dexdrip/utilitymodels/IdempotentMigrations.java
+++ b/app/src/main/java/com/eveningoutpost/dexdrip/utilitymodels/IdempotentMigrations.java
@@ -149,6 +149,9 @@ private static void legacySettingsFix() {
Pref.setBoolean("ob1_g5_fallback_to_xdrip", false);
Pref.setBoolean("always_unbond_G5", false);
Pref.setBoolean("always_get_new_keys", true);
+ Pref.setBoolean("run_ble_scan_constantly", false);
+ Pref.setBoolean("run_G5_ble_tasks_on_uithread", false);
+ Pref.setBoolean("ob1_initiate_bonding_flag", true);
}
private static void legacySettingsMoveLanguageFromNoToNb() {
// Check if the user's language preference is set to "no"
diff --git a/app/src/main/java/com/eveningoutpost/dexdrip/utilitymodels/Notifications.java b/app/src/main/java/com/eveningoutpost/dexdrip/utilitymodels/Notifications.java
index 12500de838..ce7d28e1ee 100644
--- a/app/src/main/java/com/eveningoutpost/dexdrip/utilitymodels/Notifications.java
+++ b/app/src/main/java/com/eveningoutpost/dexdrip/utilitymodels/Notifications.java
@@ -651,6 +651,8 @@ public synchronized Notification createOngoingNotification(BgGraphBuilder bgGrap
if (lastReading != null) {
b.setWhen(lastReading.timestamp);
+ b.setShowWhen(true);
+
final SpannableString deltaString = new SpannableString("Delta: " + ((dg != null) ? (dg.spannableString(dg.unitized_delta + (dg.from_plugin ? " "+context.getString(R.string.p_in_circle) : "")))
: bgGraphBuilder.unitizedDeltaString(true, true)));
diff --git a/app/src/main/java/com/eveningoutpost/dexdrip/utilitymodels/SaveLogs.java b/app/src/main/java/com/eveningoutpost/dexdrip/utilitymodels/SaveLogs.java
new file mode 100644
index 0000000000..a8a806ef68
--- /dev/null
+++ b/app/src/main/java/com/eveningoutpost/dexdrip/utilitymodels/SaveLogs.java
@@ -0,0 +1,110 @@
+package com.eveningoutpost.dexdrip.utilitymodels;
+
+import android.Manifest;
+import android.app.Activity;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.os.Environment;
+import android.view.View;
+import android.widget.TextView;
+
+import com.eveningoutpost.dexdrip.BaseAppCompatActivity;
+import com.eveningoutpost.dexdrip.R;
+import com.eveningoutpost.dexdrip.models.JoH;
+import com.eveningoutpost.dexdrip.models.UserError;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+import static com.eveningoutpost.dexdrip.utils.FileUtils.makeSureDirectoryExists;
+
+import androidx.core.app.ActivityCompat;
+import androidx.core.content.ContextCompat;
+
+// Saves xDrip logs to storage.
+// SendFeedBack sends logs to the lead developer.
+// This does the same thing for saving logs to storage.
+// Navid200
+// July 2024
+
+public class SaveLogs extends BaseAppCompatActivity {
+
+ private static final String TAG = "save logs";
+ private String LOG_FILE_PATH = "/Download/xDrip-export"; // Path to where we save the log file
+ private String LOG_FILE_NAME = "xDrip-log.txt"; // Log file name
+ private final static int MY_PERMISSIONS_REQUEST_STORAGE = 104;
+ private String log_data = "";
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_save_logs);
+
+ Intent intent = getIntent();
+ if (intent != null) {
+ final Bundle bundle = intent.getExtras();
+ if (bundle != null) {
+ final String str2 = bundle.getString("generic_text");
+ if (str2 != null) {
+ log_data = str2;
+ ((TextView) findViewById(R.id.yourSaveText)).setText(log_data.length() > 300 ? "\n\nAttached " + log_data.length() + " characters of log data. (hidden)\n\n" : log_data);
+ }
+ }
+ }
+ }
+
+ public void closeActivity(View myview) {
+ finish();
+ }
+
+ public void saveLogs(View myview) {
+ if (saveLogsToStorage(log_data)) {
+ UserError.Log.e(TAG, "Saved log file to /Downloads/xDrip-export/xDrip-log.txt");
+ } else {
+ UserError.Log.e(TAG, "Could not write log file");
+ }
+ log_data = "";
+ closeActivity(null); // Let's close the menu
+ }
+
+ public boolean saveLogsToStorage(String contents) {
+ if (isStorageWritable(this, MY_PERMISSIONS_REQUEST_STORAGE)) {
+ try {
+ final StringBuilder sb = new StringBuilder();
+ sb.append(Environment.getExternalStorageDirectory().getAbsolutePath());
+ sb.append(LOG_FILE_PATH);
+ final String dir = sb.toString();
+ makeSureDirectoryExists(dir);
+ final String pathPlusFileName = dir + "/" + LOG_FILE_NAME;
+ final File myExternalFile = new File(pathPlusFileName);
+ FileOutputStream fos = new FileOutputStream(myExternalFile);
+ fos.write(contents.getBytes());
+ fos.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return true;
+ } else {
+ JoH.static_toast_long("getString(R.string.sdcard_not_writable_cannot_save)");
+ return false;
+ }
+ }
+
+ public static boolean isStorageWritable(Activity context, int request_code) { // Get write permission if not & return false. Return true if yes and not tied up.
+ if (ContextCompat.checkSelfPermission(context,
+ android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
+ != PackageManager.PERMISSION_GRANTED) {
+ ActivityCompat.requestPermissions(context,
+ new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
+ request_code);
+ UserError.Log.e(TAG, "Did not have write permission, but should have it now");
+ return false;
+ }
+ String state = Environment.getExternalStorageState();
+ return Environment.MEDIA_MOUNTED.equals(state);
+ }
+
+}
+
diff --git a/app/src/main/java/com/eveningoutpost/dexdrip/utilitymodels/SendFeedBack.java b/app/src/main/java/com/eveningoutpost/dexdrip/utilitymodels/SendFeedBack.java
index 7f05385904..7b6c080af4 100644
--- a/app/src/main/java/com/eveningoutpost/dexdrip/utilitymodels/SendFeedBack.java
+++ b/app/src/main/java/com/eveningoutpost/dexdrip/utilitymodels/SendFeedBack.java
@@ -78,7 +78,7 @@ protected void onCreate(Bundle savedInstanceState) {
final String str2 = bundle.getString("generic_text");
if (str2 != null) {
log_data = str2;
- ((EditText) findViewById(R.id.yourText)).setText(log_data.length() > 300 ? "\n\nPlease describe what you think these logs may show? Explain the problem if there is one.\n\nAttached " + log_data.length() + " characters of log data. (hidden)\n\n" : log_data);
+ ((EditText) findViewById(R.id.yourText)).setText(log_data.length() > 300 ? "\n\nPlease describe what you think these logs may show. Explain the problem if there is one.\n\nAttached " + log_data.length() + " characters of log data. (hidden)\n\n" : log_data);
type_of_message = "Log Push";
myrating.setVisibility(View.GONE);
ratingtext.setVisibility(View.GONE);
@@ -177,7 +177,7 @@ public void sendFeedback(View myview) {
try {
final RequestBody formBody = new FormEncodingBuilder()
.add("contact", contact.getText().toString())
- .add("body", JoH.getDeviceDetails() + "\n" + JoH.getVersionDetails() + "\n" + getBestCollectorHardwareName() + "\n===\n\n" + yourtext.getText().toString() + " \n\n===\nType: " + type_of_message + "\nLog data:\n\n" + log_data + "\n\n\nSent: " + JoH.dateTimeText(JoH.tsl()))
+ .add("body",yourtext.getText().toString() + " \n\n===\nType: " + type_of_message + "\nLog data:\n\n" + log_data) // Adding "Your text" and type to the log
.add("rating", String.valueOf(myrating.getRating()))
.add("type", type_of_message)
.build();
diff --git a/app/src/main/java/com/eveningoutpost/dexdrip/utils/Preferences.java b/app/src/main/java/com/eveningoutpost/dexdrip/utils/Preferences.java
index afbb490e9a..d86da4ce00 100644
--- a/app/src/main/java/com/eveningoutpost/dexdrip/utils/Preferences.java
+++ b/app/src/main/java/com/eveningoutpost/dexdrip/utils/Preferences.java
@@ -17,6 +17,8 @@
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.media.Ringtone;
import android.media.RingtoneManager;
@@ -124,12 +126,20 @@
import com.eveningoutpost.dexdrip.webservices.XdripWebService;
import com.eveningoutpost.dexdrip.xDripWidget;
import com.eveningoutpost.dexdrip.xdrip;
+import com.google.zxing.BinaryBitmap;
+import com.google.zxing.MultiFormatReader;
+import com.google.zxing.NotFoundException;
+import com.google.zxing.RGBLuminanceSource;
+import com.google.zxing.Result;
+import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;
import com.nightscout.core.barcode.NSBarcodeConfig;
import net.tribe7.common.base.Joiner;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
import java.lang.reflect.Method;
import java.net.URI;
import java.text.DecimalFormat;
@@ -170,6 +180,13 @@ public class Preferences extends BasePreferenceActivity implements SearchPrefere
private static AllPrefsFragment pFragment;
private BroadcastReceiver mibandStatusReceiver;
+ // The following three variables enable us to create a common state from the input,
+ // whether we scan from camera or a file, and continue with the same following
+ // set of commands to avoid code duplication.
+ private volatile String scanFormat = null; // The format of the scan
+ private volatile String scanContents = null; // Text content of the scan coming either from camera or file
+ private volatile byte[] scanRawBytes = null; // Raw bytes of the scan
+
private void refreshFragments() {
refreshFragments(null);
}
@@ -341,7 +358,11 @@ public static Boolean getBooleanPreferenceViaContextWithoutException(Context con
@Override
- public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ protected synchronized void onActivityResult(int requestCode, int resultCode, Intent data) {
+ // Let's reset variables just to be sure
+ scanFormat = null;
+ scanContents = null;
+ scanRawBytes = null;
if (requestCode == Constants.HEALTH_CONNECT_RESPONSE_ID) {
if (HealthConnectEntry.enabled()) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
@@ -352,22 +373,64 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) {
}
}
+ if (requestCode == Constants.ZXING_FILE_REQ_CODE) { // If we are scanning an image file, not using the camera
+ // The core of the following section, selecting the file, converting it into a bitmap, and then to a bitstream, is from:
+ // https://stackoverflow.com/questions/55427308/scaning-qrcode-from-image-not-from-camera-using-zxing
+ if (data == null || data.getData() == null) {
+ Log.e("TAG", "No file was selected");
+ return;
+ }
+ Uri uri = data.getData();
+ try {
+ InputStream inputStream = getContentResolver().openInputStream(uri);
+ Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
+ if (bitmap == null) {
+ Log.e("TAG", "uri is not a bitmap," + uri.toString());
+ return;
+ }
+ int width = bitmap.getWidth(), height = bitmap.getHeight();
+ int[] pixels = new int[width * height];
+ bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
+ bitmap.recycle();
+ bitmap = null;
+ RGBLuminanceSource source = new RGBLuminanceSource(width, height, pixels);
+ BinaryBitmap bBitmap = new BinaryBitmap(new HybridBinarizer(source));
+ MultiFormatReader reader = new MultiFormatReader();
+ try {
+ Result result = reader.decode(bBitmap);
+ scanFormat = result.getBarcodeFormat().toString();
+ scanContents = result.getText(); // The text content of the scanned file
+ scanRawBytes = result.getRawBytes();
+ } catch (NotFoundException e) {
+ Log.e("TAG", "decode exception", e);
+ }
+ } catch (FileNotFoundException e) {
+ Log.e("TAG", "can not open file" + uri.toString(), e);
+ }
+ } else if (requestCode == Constants.ZXING_CAM_REQ_CODE) { // If we are scanning from camera
+ IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
+ scanFormat = scanResult.getFormatName();
+ scanContents = scanResult.getContents(); // The text content of the scan from camera
+ scanRawBytes = scanResult.getRawBytes();
+ }
+ // We now have scan format, scan text content, and scan raw bytes in the corresponding variables.
+ // Everything after this is applied whether we scanned with camera or from a file.
- IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
- if (scanResult == null || scanResult.getContents() == null) {
+ if (scanContents == null) { // If we have no scan content
+ UserError.Log.d(TAG, "No scan results ");
return;
}
- if (scanResult.getFormatName().equals("QR_CODE")) {
- final String scanresults = scanResult.getContents();
- if (QRcodeUtils.hasDecoderMarker(scanresults)) {
- installxDripPlusPreferencesFromQRCode(prefs, scanresults);
+ if (scanFormat.equals("QR_CODE")) { // The scan is a QR code
+
+ if (QRcodeUtils.hasDecoderMarker(scanContents)) {
+ installxDripPlusPreferencesFromQRCode(prefs, scanContents);
return;
}
try {
- if (BlueJay.processQRCode(scanResult.getRawBytes())) {
+ if (BlueJay.processQRCode(scanRawBytes)) {
refreshFragments();
return;
}
@@ -376,7 +439,7 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) {
}
- final NSBarcodeConfig barcode = new NSBarcodeConfig(scanresults);
+ final NSBarcodeConfig barcode = new NSBarcodeConfig(scanContents);
if (barcode.hasMongoConfig()) {
if (barcode.getMongoUri().isPresent()) {
SharedPreferences.Editor editor = prefs.edit();
@@ -427,9 +490,9 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) {
editor.putBoolean("cloud_storage_mqtt_enable", false);
editor.apply();
}
- } else if (scanResult.getFormatName().equals("CODE_128")) {
- Log.d(TAG, "Setting serial number to: " + scanResult.getContents());
- prefs.edit().putString("share_key", scanResult.getContents()).apply();
+ } else if (scanFormat.equals("CODE_128")) {
+ Log.d(TAG, "Setting serial number to: " + scanContents);
+ prefs.edit().putString("share_key", scanContents).apply();
}
refreshFragments();
}
@@ -1006,6 +1069,7 @@ public void onCreate(Bundle savedInstanceState) {
addPreferencesFromResource(R.xml.pref_data_sync);
setupBarcodeConfigScanner();
setupBarcodeShareScanner();
+ setupQrFromFile();
bindPreferenceSummaryToValue(findPreference("cloud_storage_mongodb_uri"));
bindPreferenceSummaryToValue(findPreference("cloud_storage_mongodb_collection"));
bindPreferenceSummaryToValue(findPreference("cloud_storage_mongodb_device_status_collection"));
@@ -1184,11 +1248,6 @@ public boolean onPreferenceChange(Preference preference, Object newValue) {
final Preference collectionMethod = findPreference("dex_collection_method");
final Preference runInForeground = findPreference("run_service_in_foreground");
final Preference g5nonraw = findPreference("g5_non_raw_method");
- final Preference g5extendedsut = findPreference("g5_extended_sut");
- final Preference scanConstantly = findPreference("run_ble_scan_constantly");
- final Preference runOnMain = findPreference("run_G5_ble_tasks_on_uithread");
- final Preference reAuth = findPreference("always_get_new_keys");
- final Preference reBond = findPreference("always_unbond_G5");
final Preference wifiRecievers = findPreference("wifi_recievers_addresses");
final Preference predictiveBG = findPreference("predictive_bg");
final Preference interpretRaw = findPreference("interpret_raw");
@@ -1275,6 +1334,7 @@ public boolean onPreferenceChange(Preference preference, Object newValue) {
final Preference shFollowUser = findPreference("shfollow_user");
final Preference shFollowPass = findPreference("shfollow_pass");
+ final Preference shFollowServerUS = findPreference("dex_share_us_acct");
if (collectionType == DexCollectionType.SHFollow) {
final Preference.OnPreferenceChangeListener shFollowListener = new Preference.OnPreferenceChangeListener() {
@@ -1289,6 +1349,7 @@ public boolean onPreferenceChange(Preference preference, Object newValue) {
try {
shFollowUser.setOnPreferenceChangeListener(shFollowListener);
shFollowPass.setOnPreferenceChangeListener(shFollowListener);
+ shFollowServerUS.setOnPreferenceChangeListener(shFollowListener);
} catch (Exception e) {
//
}
@@ -1297,6 +1358,7 @@ public boolean onPreferenceChange(Preference preference, Object newValue) {
try {
collectionCategory.removePreference(shFollowUser);
collectionCategory.removePreference(shFollowPass);
+ collectionCategory.removePreference(shFollowServerUS);
} catch (Exception e) {
//
}
@@ -2522,6 +2584,8 @@ private void removeLegacyPreferences() {
// removePreferenceFromCategory("ob1_g5_fallback_to_xdrip", "ob1_options");
// removePreferenceFromCategory("always_unbond_G5", "ob1_options");
// removePreferenceFromCategory("always_get_new_keys", "ob1_options");
+ // removePreferenceFromCategory("run_ble_scan_constantly", "ob1_options");
+ // removePreferenceFromCategory("run_G5_ble_tasks_on_uithread", "ob1_options");
}
private void removePreferenceFromCategory(final String preference, final String category) {
@@ -2853,6 +2917,16 @@ public boolean onPreferenceClick(Preference preference) {
});
}
+ private void setupQrFromFile() {
+ findPreference("qr_code_from_file").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
+ @Override
+ public boolean onPreferenceClick(Preference preference) { // Listener for scanning QR code from file
+ new QrCodeFromFile(getActivity()).scanFile();
+ return true;
+ }
+ });
+ }
+
private void refresh_extra_items() {
try {
if (this.prefs == null) return;
diff --git a/app/src/main/java/com/eveningoutpost/dexdrip/utils/QrCodeFromFile.java b/app/src/main/java/com/eveningoutpost/dexdrip/utils/QrCodeFromFile.java
new file mode 100644
index 0000000000..c275d5dc76
--- /dev/null
+++ b/app/src/main/java/com/eveningoutpost/dexdrip/utils/QrCodeFromFile.java
@@ -0,0 +1,67 @@
+package com.eveningoutpost.dexdrip.utils;
+
+import android.app.Activity;
+import android.content.Intent;
+
+import com.eveningoutpost.dexdrip.models.UserError;
+import com.eveningoutpost.dexdrip.utilitymodels.Constants;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * This is a helper class to manage QR code scan from file and
+ * return results to the instantiating activity to complement the existing scan from camera function.
+ * The scan from file portion reference: https://stackoverflow.com/questions/55427308/scaning-qrcode-from-image-not-from-camera-using-zxing
+ */
+
+public class QrCodeFromFile {
+ private static final String TAG = QrCodeFromFile.class.getSimpleName();
+
+ private Activity activity;
+ private Collection desiredBarcodeFormats;
+
+
+ public QrCodeFromFile(Activity activity) {
+ this.activity = activity;
+ }
+
+ public QrCodeFromFile setDesiredBarcodeFormats(Collection desiredBarcodeFormats) {
+ this.desiredBarcodeFormats = desiredBarcodeFormats;
+ return this;
+ }
+
+ public final void initiateFileScan() {
+ UserError.Log.e(TAG, "Navid_ initiate scan");
+
+ // TODO Replace startActivityForResult with Androidx Activity Result APIs
+ this.activity.startActivityForResult(this.createFileScanIntent(), Constants.ZXING_FILE_REQ_CODE);
+
+ }
+
+ public Intent createFileScanIntent() {
+ Intent pickIntent = new Intent(Intent.ACTION_PICK);
+ pickIntent.setDataAndType( android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
+
+ return pickIntent;
+ }
+
+ private static List list(String... values) {
+ return Collections.unmodifiableList(Arrays.asList(values));
+ }
+
+ public void scanFile() { // Copied (and slightly modified) from AndroidBarcode.scan()
+ UserError.Log.e(TAG, "Navid_ scanFile ");
+ actuallyStartScanFile();
+ }
+
+ private void actuallyStartScanFile() {
+ UserError.Log.e(TAG, "Navid_ actuallyScan ");
+ new QrCodeFromFile(activity)
+ .setDesiredBarcodeFormats(list("QR_CODE", "CODE_128"))
+ .initiateFileScan();
+ }
+
+}
diff --git a/app/src/main/res/layout/activity_event_log.xml b/app/src/main/res/layout/activity_event_log.xml
index 71e522b53e..a65bb8d699 100644
--- a/app/src/main/res/layout/activity_event_log.xml
+++ b/app/src/main/res/layout/activity_event_log.xml
@@ -139,6 +139,17 @@
android:layout_weight="1"
android:onClick="uploadEventLogs"
android:text="@string/upload_logs"
+ android:textAllCaps="false"
+ android:textAlignment="center" />
+
+
diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml
index db62d1e60b..6a91459da7 100644
--- a/app/src/main/res/layout/activity_home.xml
+++ b/app/src/main/res/layout/activity_home.xml
@@ -540,21 +540,19 @@
diff --git a/app/src/main/res/layout/activity_save_logs.xml b/app/src/main/res/layout/activity_save_logs.xml
new file mode 100644
index 0000000000..810e9cc6d6
--- /dev/null
+++ b/app/src/main/res/layout/activity_save_logs.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_send_feed_back.xml b/app/src/main/res/layout/activity_send_feed_back.xml
index edd5602d2a..fc6711e583 100644
--- a/app/src/main/res/layout/activity_send_feed_back.xml
+++ b/app/src/main/res/layout/activity_send_feed_back.xml
@@ -9,18 +9,23 @@
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.eveningoutpost.dexdrip.utilitymodels.SendFeedBack">
-
+
+
+ android:inputType="textMultiLine"
+ android:text="" />
+ android:layout_below="@+id/yourText" />
Автоматично конфигуриранеАвтоматично конфигуриране с баркод.
+ Камера
+ Сканиране на QR код с телефон (препоръчително)
+ Изображение
+ Може да запаметите QR код на файл като картина (пр. .png или .jpeg) на вашия телефон. По- късно може да се използва обция за сканиране на QR код от запаметени файлове.Сканирай сподели баркодИли сканирай баркода от споделения приемник
@@ -115,6 +119,7 @@
xDrip+ има налична актуализацияСподели настройки чрез QR кодИзпрати обратна връзка на Jamorham
+ Запазване на логоветеParakeet Map/КартаПредпочитания за показванеИмпортирай / Експортирай характеристика
@@ -394,7 +399,9 @@
Моля, въведете своя въпрос или коментар тук.\n\nАко предоставите имейл адрес, може да получите отговор.\n\nДопълнителена информация за контакт. например: email адресИзпрати Съобщение
+ Запазване на логоветеМоля, оценете приложението
+ Внимание!\nЛоговрте може да съдържат конфиденциална информация като пароли или потребителски ID.Предпочитанията са запазени във вътрешна памет/изтеглянеПроблем при писането в SD карта - проверете разрешенията?Заредени предпочитания! - Рестартиране
@@ -601,7 +608,7 @@
Включване на BluetoothНулиране на Bluetooth, като го се изклю и включи, ако не се получат данни след 20 минутиСледи връзката между телефона Ви и носещото данните устройсво ( което е прикрепено към тялото Ви) да е стабилна и данните да се пренасят точно
- Нулирайте Bluetooth, като го изключите и включите като начин да поддържате източника на данни G5 работещ. Без това колекционерът G5 може да се провали.
+ Нулирайте Bluetooth, като го изключите и включите като начин да поддържате източника на данни работещ. Без това колекционерът може да се провали.Dex - става въпрос за Дексом уреда за продължително проследяване нивото на кръвната захар и връзката му с Bluetooth WatchdogАко Bluetooth watchdog се активира често, можете да опитате да премахнете отметката от тази опция, за да видите дали помагаПо-стари Bluetooth wakelocks, които могат да изразходват допълнително батерията, но може да са необходими за Bluetooth приемане
@@ -695,12 +702,12 @@
Използвайте метод за четене, оптимизиран за произволен етикетНиско ниво на диагностична/прототипна стойностID на вашия предавател Dexcom, напр. 12AB3
- Разширени настройки на G5 за редки ситуации
- G5/G6/Dex1 Debug Настройки
+ Разширени настройки на Dexcom за редки ситуации
+ G6/Dex1 Debug НастройкиНякои устройства работят по-добре при постоянно сканиране, други не. Ако четенето е надеждно, когато тази настройка не е избрана, трябва да имате подобрен живот на батерията. Обикновено е най-добре това да е деактивираноПостоянно сканирай за G5Това е от решаващо значение за правилното свързване на някои устройства с Android, но може да причини пропуснати показания, когато се използват други интензивни дейности на потребителския интерфейс.
- Принуди G5 към UI Thread
+ Принуди Dexcom към UI ThreadАутентикирай преди всяко четенеТова ще направи опит за пълно удостоверяване при всеки опит за четене. Необходим за по-нови версии на фърмуера на предавателя G5.Премахване на G5 преди всяко четене
@@ -1171,7 +1178,7 @@
Изпратете нивото на bridge батерията на Nightscout. Премахнете отметката, ако сензорът на батерията ви е повреден.Качване на bridge батерияИзпратете статистика за батерията на предавателя Dexcom до Nightscout. Включва всички данни, показани на екрана за състояние на колекционера.
- Качване на OB1G5/G6 батерия на предавателя
+ Качване на Dexcom батерия на предавателяИзпратете данни за лечението на Nightscout. Премахнете отметката, ако вашият портал за грижи е повреден.Качване на леченияВизуално и звуково известие, ако качването на Nightscout е неуспешно.
@@ -1314,7 +1321,7 @@
Изтеглете хранения от CareLinkИзвестияИзтегли известия от CareLink
- OB1 G5/G6/G7 Настройки на колекционера
+ OB1 G6/G7 Настройки на колекционераПълно презаписване, трябва да работи на Android 4.4 - 9, поддържа естествен режим и дрИзползвайте колекционера OB1Използвайте вътрешния алгоритъм на трансмитера, за да изчислите стойностите на глюкозата, когато е възможно.
@@ -1335,8 +1342,8 @@
Разрешаване на OB1 развързванеКолекционерът OB1 може да инициира свързване.Позволете на OB1 да започне свързване
- Стари настройки на G5 колекционера
- G5/G6 опции за батерията
+ Стари настройки на колекционера
+ G6 опции за батериятаРегулирайте нивото на батерията за предупреждениеПлъгини и функцииСензор за сърдечен ритъм
@@ -1830,6 +1837,7 @@
Изберете крайно времеПриемане на глюкозаОбработване на данните за лечение, получени от приложението NSClient
+ Звързване с Google HealthАудио фокусИзберете какво да правите с другите приложения, докато се възпроизвеждат аларми и регулиране нивата на звука на систематаНе коригирай звуците на други приложения
diff --git a/app/src/main/res/values-cs/strings-cs.xml b/app/src/main/res/values-cs/strings-cs.xml
index b7ce2a783c..1fec074a28 100644
--- a/app/src/main/res/values-cs/strings-cs.xml
+++ b/app/src/main/res/values-cs/strings-cs.xml
@@ -37,6 +37,10 @@
Cloudové úložištěAutomatická konfiguraceAutomatická konfigurace pomocí čárového kódu.
+ Fotoaparát
+ Naskenovat QR kód pomocí telefonu (doporučeno)
+ Obrazový soubor
+ Můžete uložit QR kód jako obrázkový soubor (například .png nebo .jpeg soubor) do vašeho telefonu. Poté můžete použít tuto volbu k naskenování QR kódu z tohoto uloženého souboru.Skenovat čárový kód na přijímačiNebo naskenovat čárový kód na přijímači
@@ -115,6 +119,7 @@
xDrip+ K dispozici je aktualizaceSdílet nastavení pomocí QR kóduPoslat zpětnou vazbu Jamorhamovi (autor)
+ Uložit záznamy událostíMapa ParakeetůZobrazit možnostiMožnosti importu/exportu
@@ -394,7 +399,9 @@
Prosím zde vložte Vaší otázku nebo komentář.\n\nPokud zadáte i emailovou adresu, můžete obdržet odpověď.\n\nVolitelné kontaktní informace jako email atd.Odeslat zprávu
+ Uložit záznamy událostíProsím napište, co si myslíte o aplikaci obecně
+ Varování!\nZáznamy událostí mohou obsahovat důvěrné informace - jako jsou hesla nebo identifikaci uživatele.Nastavení uložena do SD karty do složky Stažené dokumentyNelze zapsat na SD kartu - zkontrolujte oprávnění?Nastavení načtena! Restartuji
diff --git a/app/src/main/res/values-es/strings-es.xml b/app/src/main/res/values-es/strings-es.xml
index ded9affe86..435c0ff21a 100644
--- a/app/src/main/res/values-es/strings-es.xml
+++ b/app/src/main/res/values-es/strings-es.xml
@@ -593,7 +593,7 @@
Mostrar acceso directo en el menú ☰ para conmutar Lecturas HabladasAcceso directo Lecturas HabladasEn Android 6+ garantiza que la optimización de la batería está apagada. Recomendado
- No sigas preguntando por la optimización de la batería (no recomendable)
+ No insistir sobre la optimización de batería. No recomendado.Aviso de optimización de BateríaAjustes Bluetooth AvanzadosAjustes Bluetooth
@@ -601,7 +601,7 @@
Encender BluetoothResetear Bluetooth apagándolo y encendiéndolo si no hay comunicación en 20 minutosVigilante Bluetooth
- Resetear Bluetooth apagándolo y encendiéndolo para intentar que G5 siga funcionando. Sin esto el colector de G5 puede fallar.
+ Reinicializar Bluetooth apagándolo y encendiéndolo para intentar que G5 siga funcionando. Sin esto, el colector de G5 puede fallar.Vigilante Dex BluetoothSi el vigilante del Bluetooth se activa frecuentemente puede intentar desactivar esta opción para ver si ayudaWakelocks Bluetooth más antiguos que pueden consumir más batería pero que pueden ser necesarios para la recepción Bluetooth
diff --git a/app/src/main/res/values-et/strings-et.xml b/app/src/main/res/values-et/strings-et.xml
index 880034c7ac..924febf05d 100644
--- a/app/src/main/res/values-et/strings-et.xml
+++ b/app/src/main/res/values-et/strings-et.xml
@@ -37,6 +37,10 @@
PilvesalvestusAutomaatne seadistamineAutomaatne seadistamine kasutades triipkoodi.
+ Kaamera
+ Skaneeri telefoniga QR-kood (soovitatud)
+ Pildifail
+ Saad salvestada QR-koodi pildifailina (nagu .png või .jpeg) oma telefoni. Siis kasuta seda valikut, et salvestatud failist QR-kood skaneerida.Skaneeri jagatud triipkoodiVõi skaneeri triipkoodi jagajalt
@@ -115,6 +119,7 @@
xDrip+ uuendus saadavalJaga seadeid QR koodigaSaada tagasisidet
+ Salvesta logidParakeet kaartEkraani seadedImpordi / ekspordi valikud
@@ -394,7 +399,9 @@
Palun sisesta oma küsimused või kommentaarid siia.\n\nKui lisad meiliaadressi, võid isegi saada vastuse.\n\nValikuline kontaktinfo siia, nt. e-mailSaada sõnum
+ Salvesta logidPalun anna teada, mis sa äpist üldiselt arvad
+ Hoiatus!\nLogid võivad sisaldada konfidentsiaalset informatsiooni, näiteks paroole või kasutajatunnuseid.Eelistused on salvestatud sisemisse salvestusruumi/allalaadimiste kaustaSD kaardile ei saa kirjutada, kontrolli õigusi?Seaded laaditud! - Taaskäivitus
@@ -593,7 +600,7 @@
Näita menüüs ☰ otseteed, et lülitada andmete ettelugemine sisseAndmete ütlemise otseteeAlates Android 6 veenduge, et aku optimeerimine oleks välja lülitatud (soovitatav).
- Ära enam küsi aku säästerežiimi kohta (pole soovitatav).
+ Ära küsi pidevalt aku optimeerimise kohta kui see on lubatud (pole soovitatav).Aku optimeerimise otseteeBluetoothi täpsemad sättedBluetoothi seaded
@@ -601,7 +608,7 @@
Lülitage Bluetooth sisseTaaskäivita Bluetooth sisse-välja lülitades, kui 20 min jooksul andmeid ei saaBluetoothi jälgija
- Lähtesta Bluetooth sisse-välja lülitades, et hoida G5 andmeallikas töös. Ilma selleta võib G5 vastuvõtja üles öelda.
+ Lähtesta Bluetooth, lülitades seda välja ja sisse, et andmeallikat töös hoida. Ilma selleta võib vastuvõtja töö seiskuda.Dex Bluetooth jälgijaKui bluetoothi jälgija aktiveerub tihti, võite proovida selle valiku tühistada, et näha kas see aitabVanemad Bluetooth wakelockid, mis võivad akut rohkem kulutada, aga võivad olla vajalikud bluetooth-vastuvõtuks
@@ -655,7 +662,7 @@
Näita insuliini kogust kokkuInsuliini kokkuSensorilt vastu võetud näitude protsent
- Reaalajas saadud sensori näitude protsent (tagasi täitmata). AINULT G5 algne režiim
+ Reaalajas saadud sensori näitude protsent (tagasi täitmata). AINULT algse režiimi korralAndmepakettide vastuvõtuprotsentAndmepakettide vastuvõtuprotsent reaalajasKuva viimase 3 päeva kalibreerimistäpsuse hinnang
@@ -697,11 +704,11 @@
Madala taseme diagnostiline/prototüüp-väärtusTeie Dexcomi saatja ID, nt. 12AB3Täiendavad Dexcom seaded harvaesinevateks olukordadeks
- G5/G6/G7/Dex1 silumisseaded
+ Dexcom silumisseadedMõned seadmed töötavad paremini pidevalt skaneerides, teised mitte. Kui see säte pole valitud ja andmed on usaldusväärsed, siis peaks aku tööiga olema pikem. Tavaliselt on parem see mitte valida
- Skaneeri G5-saatjat pidevalt
+ Skaneeri saatjat pidevaltSee on oluline mõnede Android seadmete ühenduvuse jaoks, kuid andmed võivad jääda lugemata muude UI intensiivste tegevuste kasutamisel.
- Sunni G5 kasutajaliidese lõimele
+ Sunni kasutajaliidese lõimeleAutentida enne igat lugemistSee proovib täielikku autentimist igal lugemiskatsel. Vajalik uuemate G5 saatja versioonide jaoks.Enne iga vastuvõttu katkesta ühendus G5-ga
@@ -1178,12 +1185,12 @@
Saada oma vastuvõtja aku tase Nightscouti. Tühjendage märkeruut kui akuandur ei tööta.Laadi üles vastuvõtja aku seisSaada Nightscouti Dexcomi saatja aku statistika. Sealhulgas kõik vastuvõtja oleku ekraanil kuvatavad andmed.
- Laadi üles OB1G5/G6/G7/1 saatja akuandmed
+ Laadi üles Dexcom saatja akuandmedSaada raviandmed Nightscouti. Tühjendage märkeruut kui hooldusportaal ei toimi.Laadi üles raviandmedKui Nightscouti üleslaadimine ebaõnnestub, anna ekraanil ja heliga märku.Hoiata tõrgete korral
- G5 puhul saadab Nightscouti vastuvõtu tüübi (nt OB1) ja näitude järeltäitmise oleku (algupärase režiimi jaoks).
+ Dexcom puhul saadab Nightscouti vastuvõtu tüübi (nt OB1) ja näitude järeltäitmise oleku (algupärase režiimi jaoks).Lisa seadme nimele andmeallika infoPuuduta vanade andmete saatmiseks NightscoutiTäienda ajalugu
@@ -1322,7 +1329,7 @@
Laadi CareLink\'ist alla einedTeavitusedLaadi alla CareLink teavitused
- OB1 G5/G6/G7 vastuvõtja seaded
+ OB1 Dexcom vastuvõtja seadedTäielik ülekirjutamine, peaks töötama op-süsteemides Android 4.4–9, toetab algupärast režiimi ja palju muudKasuta OB1 vastuvõtjatVõimalusel kasuta VS väärtuste arvutamiseks saatja sisemist algoritmi.
@@ -1337,14 +1344,14 @@
Tagasi xDrip\'piKasutage heuristikat, et minimeerida Bluetooth skaneerimist ja säästa energiatMinimaalne skaneerimine
- Kasutan G6, G7 või Dexcom One sensorit
- G6/G7/Dex1 tugi
+ Kasutan G6, G7, Dexcom 1või One+ sensorit
+ G6/G7/Dex1/One+ tugiOB1 vastuvõtja võib ühenduse katkestada kui arvab, et andmete töötlemine ebaõnnestus. Kui teil tekib ühenduse katkestamisel probleeme, keelake see valik. Kui te seejärel ühenduse täielikult kaotate, veenduge, et see oleks lubatud.Luba OB1 lahtiühendamineOB1 vastuvõtja võib alustada ühendamist.Luba OB1 siduda
- Vana G5 vastuvõtja seaded
- G5/G6/Dex1 aku valikud
+ Vanad Dexcom vastuvõtja seaded
+ G6/Dex1 aku valikudReguleeri aku hoiatuse tasetLiidesed ja funktsioonidPulsimõõtja
diff --git a/app/src/main/res/values-fr/strings-fr.xml b/app/src/main/res/values-fr/strings-fr.xml
index 2f3f13541c..7fd5511980 100644
--- a/app/src/main/res/values-fr/strings-fr.xml
+++ b/app/src/main/res/values-fr/strings-fr.xml
@@ -37,6 +37,10 @@
Stockage CloudConfiguration automatiqueConfiguration automatique en utilisant un code-barres.
+ Caméra
+ Scannez un QR code avec votre mobile (recommandé)
+ Fichier image
+ Vous pouvez enregistrer un code QR en tant que fichier image (comme .png ou .jpeg) sur votre mobile. Ensuite, utilisez cette option pour scanner le code QR du fichier enregistré.Numériser le code-barres ShareOu scanner le code-barres sur le récepteur Share
@@ -115,6 +119,7 @@
Mise à jour xDrip+ disponiblePartager les paramètres via le code QREnvoyer des commentaires à Jamorham
+ Sauvegarder le journalCarte ParakeetPréférences d\'affichageFonctionnalités Import / Export
@@ -394,7 +399,9 @@
S\'il vous plaît entrez votre question ou commentaire.\n\nSi vous fournissez une adresse e-mail, vous pouvez obtenir une réponse. Information de contact facultative, par exemple emailEnvoyer le message
+ Sauvegarder le journalS\'il vous plaît indiquez ce que vous pensez de l\'application en général
+ Attention !\nLes journaux peuvent contenir des informations confidentielles telles que des mots de passe ou des identifiants d\'utilisateur.Préférences enregistrées dans dossier Downloads sur stockage interneImpossible d\'écrire sur la carte SD - Vérifier les autorisations ?Préférences chargées! - Redémarrage
diff --git a/app/src/main/res/values-he/strings-he.xml b/app/src/main/res/values-he/strings-he.xml
index 12f67a8fd9..189addd577 100644
--- a/app/src/main/res/values-he/strings-he.xml
+++ b/app/src/main/res/values-he/strings-he.xml
@@ -37,6 +37,10 @@
אחסון בענןהגדרה אוטומטיתהגדרה אוטומטית באמצעות ברקוד.
+ מצלמה
+ סרוק את קוה הQR עם המכשיר הסלולרי (מומלץ)
+ קובץ תמונה
+ ניתן לשמור את קוד ה ER כקובץ תמונה (כדוגמת .png או .jpeg) על המכשיר הסלולרי . לאחר מכן השתמש באופציה זו כדי לסרוק את קוד הQR מהקובץ השמור.סרוק ברקוד עבור Shareאו סרוק את הברקוד שעל מקלט ה-Share
@@ -115,6 +119,7 @@
קיים עדכון גרסא ל-xDrip+שיתוף הגדרות באמצעות קוד QRשלח פידבק ל-Jamorham
+ שמור קובץ לוגמפת Parakeetהגדרות תצוגהייבוא ויצוא של הגדרות ונתונים
@@ -393,7 +398,10 @@
אנא רשום את השאלות או הערות שלך כאן. \n\n אם תספק דואר אלקטרוני יכול להיות שתקבל תשובה \n\nאופציונלי - פרטים ליצירת קשר כגון דוא\"לשלח הודעה
+ שמור קובץ לוגאנא ציינו מה אתם חושבים על האפליקציה באופן כללי
+ אזהרה!
+קובץ הלוג יכול להכיל מידע סודי ורגיש כמו סיסמאות או שמות משתמש.ההגדרות נשמרו על כרטיס הזיכרון בתיקיית Downloadsכתיבה לכרטיס הזיכרון נכשלה - לבדוק את ההרשאות?ההעדפות נטענו! - מאתחל
diff --git a/app/src/main/res/values-hu/strings-hu.xml b/app/src/main/res/values-hu/strings-hu.xml
index df456aef39..dda98085a6 100644
--- a/app/src/main/res/values-hu/strings-hu.xml
+++ b/app/src/main/res/values-hu/strings-hu.xml
@@ -294,7 +294,7 @@
Riasztáshang beállításaOkos riasztásNincs riasztás telefonálás közben
- Szundizva indítás
+ KésleltetésÁltalános tényezővel beállításVisszaállításBeállítások okosórákhoz
diff --git a/app/src/main/res/values-it/strings-it.xml b/app/src/main/res/values-it/strings-it.xml
index e619f442b2..58f1df8f23 100644
--- a/app/src/main/res/values-it/strings-it.xml
+++ b/app/src/main/res/values-it/strings-it.xml
@@ -37,6 +37,10 @@
Memorizza nel CloudConfigurazione automaticaConfigurazione automatica utilizzando un codice QR.
+ Camera
+ Scansiona un codice QR con il tuo cellulare (consigliato)
+ File immagine
+ Puoi salvare un codice QR come un file immagine (come .png o .jpeg) sul tuo cellulare. Quindi, utilizzare questa opzione per scansionare il codice QR dal file salvato.Scan Condividi BarcodeOppure scansiona il codice sul ricevitore
@@ -115,6 +119,7 @@
xDrip+ Aggiornamento disponibileCondividi impostazioni tramite il codice QRInvia Feedback a Jamorham
+ Salva LogMappa ParakeetMostra PreferenzeFunzioni di importazione / esportazione
@@ -394,7 +399,9 @@
Inserisci la tua domanda o commenti qui.\n\nSe si fornisce un indirizzo email si può ottenere una risposta.\n\nAggiungi tuoi contatti qui qui, ad esempio, e-mailInvia messaggio
+ Salva LogSi prega di indicare quello che pensi dell\'app in generale
+ Attenzione!\nI log possono contenere informazioni riservate come password o ID utente.Preferenze salvate in Download sdcardImpossibile scrivere sul sdcard - i permessi di controllo?Preferenze caricate! - Riavvio
diff --git a/app/src/main/res/values-nb/strings-nb.xml b/app/src/main/res/values-nb/strings-nb.xml
index 07b4f1c0ed..569b297613 100644
--- a/app/src/main/res/values-nb/strings-nb.xml
+++ b/app/src/main/res/values-nb/strings-nb.xml
@@ -37,6 +37,10 @@
NettskylagringAutokonfigurerAutokonfigurer med strekkode.
+ Kamera
+ Skann en QR-kode med din mobil (anbefalt)
+ Bildefil
+ Du kan lagre QR-koden som en bildefil (f.eks. .png eller .jpeg) på mobilen din. Bruk deretter dette alternativet til å skanne QR-koden fra den lagrede filen.Skan delingsstrekkodeEller skanne strekkoden på mottakeren
@@ -53,7 +57,7 @@
Skriv inn samlingsnavnet for enhetsstatusDette er navnet på samlingen der batteriet og andre enhetsdata vil bli lagret
- Nightscout-synkronisering (REST)
+ Nightscout-synkroniseringAktivertREST API er den vanlige måten å koble til NightscoutBase-URL
@@ -115,6 +119,7 @@
xDrip+ oppdatering tilgjengeligDel innstillinger med QR-kodeSend tilbakemelding til Jamorham
+ Lagre loggerParakeet KartVis innstillingerImport / Eksport funksjoner
@@ -286,7 +291,7 @@
Eldre unødvendige wakelocks som kan tappe batteriet ekstra, men kan være nødvendig for Nightwatch eller Android WearBruk Overdreven WakelocksTaleavlesninger
- Ekstra Statuslinje
+ Ekstra statuslinjeOpplasting til Dexcom Share-serverLaste opp data til Dexcoms servere slik at du kan bruke dine data med Dexcom sine apperAdministrer følgere
@@ -394,7 +399,9 @@
Skriv inn ditt spørsmål eller kommentarer her.\n\nHvis du oppgir en e-postadresse kan det være at du få svar.\n\nValgfri kontaktinfo, for eksempel e-postSend melding
+ Lagre loggerVennligst oppgi hva du synes om programmet generelt
+ Advarsel!\nLoggene kan inneholde konfidensiell informasjon som passord eller bruker-ID\'er.Innstillinger lagret i intern lagring (Download/xDrip-export)Klarte ikke skrive til SD-kort - sjekk tillatelser?Innstillinger lastet! - Omstart
@@ -593,7 +600,7 @@
Vis snarvei til ☰ meny for å skru av/på talte avlesningerTaleavlesning-snarveiSørg for at batterioptimalisering er skrudd av for Android 6+ (anbefalt).
- Ikke fortsett å spørre om batterioptimalisering (ikke anbefalt).
+ Vil ikke fortsette å spørre om batterioptimalisering når dette er aktivert (ikke anbefalt).Batterioptimaliserings forespørselAvanserte innstillinger for BluetoothBluetooth-innstillinger
@@ -601,7 +608,7 @@
Skru på BluetoothTilbakestill Bluetooth ved å slå den av og på hvis vi ikke får noe innen 20 minutterBluetooth Watchdog
- Tilbakestill bluetooth ved å skru det av og på er en måte å sørge for at G5 datakilde fungerer. Uten dette kan G5 innsamlingstjenesten feile.
+ Tilbakestill bluetooth ved å skru det av og på er en måte å sørge for at datakilden fungerer. Uten dette kan innsamlingstjenesten feile.Dex Bluetooth vakthundHvis Bluetooth vakthund ofte blir aktivert kan du prøve å huke bort dette valget for å se om det hjelperEldre bluetoothvekkere kan tømme batteriet raskere, men kan være nødvendig for at Bluetooth skal virke
@@ -640,8 +647,8 @@
EngineeringmodusTillat ending av usikre innstillinger som kan ødelegge alt!Lagre databasen daglig
- Tillager den daglige intensjonstjenesten å lagre databasen før den tømmer
- Alternativ for ekstra linje
+ Lar den daglige intensjonstjenesten lagre databasen før tømming
+ Alternativ for ekstra statuslinjeDagens gjennomsnittlige verdi.A1c-estimat i DCCT format (%)A1c estimat i IFCC format (mmol/mol)
@@ -655,12 +662,12 @@
Vis totalt behandlingsinsulinTotalt insulinProsentandel av sensoravlesninger mottatt
- Prosentdel av sensoravlesninger mottatt i sanntid (ikke tilbakefylt). KUN G6 Native mode
+ Prosentdel av sensoravlesninger mottatt i sanntid (ikke tilbakefylt). KUN Native modePakkefangstprosentPakkefangstprosent i sanntidVis evaluering av kalibreringsnøyaktighet for siste 3 dagerEvaluering av kalibreringsnøyaktighet
- Vis også ekstra statuslinje i modul
+ Vis også ekstra statuslinje i widgetVis kurve og skjæringspunkt i langt format.Vis kurve og skjæringspunkt i kort form.Vis kurve- og glukosedata fra den aktive plugin-modulen
@@ -697,11 +704,11 @@
Lavnivå diagnose/prototype verdiID for din Dexcom-sender, f.eks. 123ABCAvanserte innstillinger for Dexcom
- G5/G6/G7/Dex1 feilsøkingsinnstillinger
+ Dexcom feilsøkingsinnstillingerNoen enheter virker bedre når de blir skannet hele tiden, andre ikke. Hvis avlesningene er stabile når denne innstillingen ikke er valgt, bør du oppleve forbedret batteribruk. Normalt er det best å beholde denne deaktivert
- Skan kontinuerling for G5
+ Skan kontinuerlingDette er viktig for noen Androidenheter for å koble til skikkelig, men kan føre til manglende avlesninger når andre UI intense aktiviteter er i bruk.
- Tving G5 til UI-tråd
+ Tving Dexcom til UI-trådAutentiser før hver avlesningDette vil forsøke en full autentisering før hvert leseforsøk. Trengs for nyere G5 fastvare versioner.Frigjør G5 før hver avlesning
@@ -722,14 +729,14 @@
InfluxDB databasenavnBrukerPassord
- Aktiver denne til å laste opp til Dexcom\'s servere
- Last opp BS-verdier som Dexcom Share
+ Aktiver dette for å laste opp blodsukkeravlesninger til Dexcom Share-servere
+ Last opp BS-verdierDeaktivert = Din konto og følger-app er fra utenfor USAAktivert = Din konto og følger-app er fra USAUSA basert Dexcom-konto
- Din innlogging til Dexcom\'s hjemmeside
+ Ditt brukernavn til Dexcom sin hjemmesideDexcom-konto
- Ditt passord for Dexcom\'s hjemmeside
+ Ditt passord for Dexcom sin hjemmesideDexcom-konto passord10-tegn serienummer til Dexcom-mottaker10-tegns serienummer for test-modus
@@ -1034,7 +1041,7 @@
Skann før du kobler til xBridge og Libre BluetoothBruk skanningBruk og stol på Android Bluetooth sin funksjon for automatisk tilkobling
- Stol på Auto-Tilkobling
+ Stol på auto-tilkoblingEksperimentell støtte for xBridge+ polling-funksjonxBridge+ polling-modusUndersøk Bluetooth-tjenester på hver tilkobling
@@ -1046,7 +1053,7 @@
Skriv batteriinformasjonen for ytterligere analyse i en fil. Vennligst bruk dette bare hvis du blir spurt av en utvikler!BatteriloggVelg å vise brobatterinivået
- Glukostilbakeholdelse
+ GlukoseretensjonSlett data som er eldre enn så mange dager. 0 = ikke slett noeAndre diverse alternativertillatt testing med død sensor
@@ -1178,12 +1185,12 @@
Send brobatterinivået ditt til Nightscout. Fjern avhukning hvis batterisensoren er ødelagt.Last opp brobatteriSend Dexcom-sender batteristatistikk til Nightscout. Dette inkluderer alle data som vises i statusskjerm for datakilde.
- Last opp OB1G5/G6/G7/1 sender-batteri
+ Last opp Dexcom sender-batteriSend behandlingsdata til Nightscout. Fjern avhukning hvis helseportalen din er ødelagt.Last opp behandlingerVis og avgi et varsel hvis Nightscout-opplastingen mislykkes.Varsling om feil
- For G5, sender innsamlertype (f.eks. OB1) og lesing av tilbakefyllingsstatus (for native) til Nightscout.
+ For Dexcom, sender innsamlertype (f.eks. OB1) og avlesning sin tilbakefyllingsstatus (for native) til Nightscout.Legg til kildeinformasjon til enhetsnavnetTrykk for å sende historiske data til NightscoutTilbakefyll data
@@ -1284,7 +1291,7 @@
Vis finn telefon / slumreVis MAC-adresseBruk løsninger for å unngå ikke-standard Android-adferd for enkelte telefoner. Uten dette klarer innsamlere vanligvis ikke å få data.
- Alternative løsninger for vekking
+ Alternativ løsning for vekkingBruk senderkalibrering i stedet for xDrip som primærMedtrum NativeHex diagnostisk testverdi
@@ -1322,7 +1329,7 @@
Last ned måltider fra CareLinkNotifikasjonerLast ned notifikasjoner fra CareLink
- OB1 G5/G6/G7 innsamlerinnstillinger
+ OB1 Dexcom innsamlerinnstillingerFullstendig omskriving, skal fungere på Android 4.4 - 9, støtter native-modus og merBruk OB1-innsamlerBruk senderens interne algoritme for å beregne glukoseverdier når det er mulig.
@@ -1337,14 +1344,14 @@
Falle tilbake til xDripBruk heuristikk for å minimere Bluetooth-skanning + spare strømMinimer skanning
- Jeg bruker en G6, G7 eller Dexcom 1 sensor
- G6/G7/Dex1-støtte
+ Jeg bruker en G6, G7 Dexcom 1 eller One+ sensor
+ G6/G7/Dex1/One+-støtteOB1-innsamleren kan frigjøre seg hvis den tror krypteringen har mislyktes. Hvis du får problemer med å oppheve sammenkoblingen, deaktiver dette alternativet. Hvis du da mister forbindelsen helt, sørg for at dette er aktivert.Tillat OB1-frakoblingOB1-innsamler kan starte binding.Tillat OB1 å starte binding
- Gammel G5-innsamler innstillinger
- G5/G6/Dex1 batterialternativer
+ Gamle Dexcom-innsamler innstillinger
+ G6/Dex1 batterialternativerJuster batterivarselnivåetPlugins og funksjonerPulsmåler
@@ -1635,8 +1642,8 @@
Vil du koble xDrip med denne sensoren? Dette vil stoppe Libre-leseren og LibreLink fra å motta varsler. Trykk ja og skann igjen for å koble til (velg ikke koble til hvis du vil kjøre xDrip med den patchede appen)Kobler Libre-sensor til BluetoothUten kameratillatelse kan vi ikke skanne en strekkode
- Lag filtrert data ved behov
- Lag manglende filtrert
+ Lager en ekstra grafkurve som viser filtrert eller utjevnet plott
+ Lag manglende filtrert plottSkjul grafen på widgets (vises ved neste avlesing)Skjul widgetgrafVis data mottatt eksternt (kun diagnostikk)
diff --git a/app/src/main/res/values-pl/strings-pl.xml b/app/src/main/res/values-pl/strings-pl.xml
index 26c93b7bc8..a8e7061ccc 100644
--- a/app/src/main/res/values-pl/strings-pl.xml
+++ b/app/src/main/res/values-pl/strings-pl.xml
@@ -37,6 +37,10 @@
Przechowywanie w chmurzeAutomatyczna konfiguracjaAutomatyczna konfiguracja za pomocą kodu kreskowego.
+ Aparat
+ Zeskanuj kod QR za pomocą telefonu komórkowego (zalecane)
+ Plik obrazu
+ Możesz zapisać kod QR jako plik obrazu (np. .png lub .jpeg) na telefonie. Następnie użyj tej opcji, aby skanować kod QR z zapisanego pliku.Skanowanie kodów kreskowych ShareLub zeskanować kod kreskowy na odbiorniku share
diff --git a/app/src/main/res/values-pt-rBR/strings-pt-rBR.xml b/app/src/main/res/values-pt-rBR/strings-pt-rBR.xml
index dea419dfa0..93a33496d6 100644
--- a/app/src/main/res/values-pt-rBR/strings-pt-rBR.xml
+++ b/app/src/main/res/values-pt-rBR/strings-pt-rBR.xml
@@ -518,10 +518,10 @@
Selecione a hora do alerta:o dia todo(toque para mudar)
- Ignorar modo de silêncio do telemóvel:
+ Ignorar o modo silencioso:Vibrar nos alertasTestar alerta
- desativar alerta
+ Desativar alertaSalvar alertaRemover alertafazer snooze ao alerta antes de ser iniciado
@@ -1028,9 +1028,12 @@
Permite calibração inicial mesmo que não existam dados bons e suficientes. Atenção que isso pode resultar numa calibração incorreta!Ignorar Controle de QualidadeEscaneie antes de conectar no xBridge e Bluetooth do Libre
+ Usar escaneamentoUsar e confiar no recurso de conexão automática Bluetooth do Android
+ Confiar na auto-conexãoSuporte experimental para o recurso de pesquisa do xBridge+Modo de sondagem xBridge+
+ Sondar serviços Bluetooth em cada conexãoSempre descobrir serviçosApenas adequado para telefones que suportam o pareamento automáticoPermitir desvinculação de BluCon
@@ -1049,6 +1052,8 @@
Lembrete de Adiar- DesfazerO botão Desfazer restaura o lembrete de como estava antes de ser deslizado.Lembrete Adiar- Lixeira
+ O botão de lixeira exclui permanentemente o lembrete apagado!
+ Painel de Silenciar Lembrete - OcultarO botão Ocultar oculta o painel de sonecaEm que dia?A que hora do dia?
@@ -1092,6 +1097,7 @@
AlternandoDias ÚteisFins de semana
+ Mega-prioridadeLembretes15 Min2 Horas
@@ -1112,6 +1118,7 @@
horasdias\"semanas\"
+ Silêncio à NoiteAlertas desativadosReiniciar pela ManhãModo Avançado
@@ -1157,6 +1164,8 @@
Calibrar utilizando novas leituras de glicose se as condições parecerem corretas para fazer isso sem pedir confirmação (experimental)Calibragem AutomáticaOpções adicionais
+ Envie o nível da bateria para o Nightscout. Desmarque se o sensor de bateria estiver defeituoso.
+ Enviar dados de bateriaEnvia estatísticas da bateria do transmissor Dexcom para o Nightscout. Inclui todos os dados mostrados na tela de Status do Coletor.Enviar bateria do OB1G5/G6/G7/1Envia dados de tratamento para o Nightscout. Desmarque se seu portal de cuidados estiver fora de serviço.
@@ -1372,7 +1381,10 @@
Pode disparar notificações de exibição ambiente em alguns dispositivos. Precisa de testes!Agrupar notificaçõesPara o perfil de volume crescente, atrasa o início do som do alerta em 3 minutos. A vibração (se ativada) começa assim que o alerta dispara, independentemente da configuração.
+ Configurações de Volume CrescenteAtrasar Volume Crescente
+ Quando ativado, o perfil de volume crescente vai até o volume médio ao invés do máximo
+ Usar volume médioReproduzir som quando a calibração inicial for necessáriaAlerta InicialQueda / Aumento da Glicose
@@ -1689,4 +1701,8 @@
Login expirado! Por favor, faça o login!Fonte de dados:Alertar novamente
+ Não ajustar sons de outros aplicativos
+ Diminuir o volume de outros aplicativos
+ Silenciar outros aplicativos quando estiver tocando
+ Silenciar todos os outros sons
diff --git a/app/src/main/res/values-ru/strings-ru.xml b/app/src/main/res/values-ru/strings-ru.xml
index 125e7123d6..95b2bb7f54 100644
--- a/app/src/main/res/values-ru/strings-ru.xml
+++ b/app/src/main/res/values-ru/strings-ru.xml
@@ -601,7 +601,7 @@
Включить BluetoothПерезапускать Bluetooth при отсутствии данных более 20 минутМониторинг состояния Bluetooth
- Требуется перезапустить Bluetooth (выключить и включить снова) в целях сохранения работоспособности источника данных G5. В противном случае, устройство сбора данных G5 может перестать работать.
+ Перезагружать Bluetooth, выключая и включая его, чтобы обеспечить работу источника данных G5. Без этого коллектор G5 может перестать работать.Мониторинг состояния G5 BluetoothЕсли Bluetooth watchdog часто активируется, вы можете попробовать отключить эту настройку, чтобы посмотреть, поможет ли этоСтарые блокировки сна Bluetooth, которые могут тратить больше батареи, но могут быть необходимы для приема Bluetooth
@@ -655,7 +655,7 @@
Отображать суммарное количество инсулина для введённых пользователем значенийСуммарное количество инсулинаПроцент полученных показаний сенсора
- Процент данных, полученных с датчика в режиме реального времени (т.е. без использования метода \'обратного заполнения\'). Используется ТОЛЬКО в нативном режиме G5
+ Процент полученных в реальном времени показаний сенсора (не восстановленных из памяти). ТОЛЬКО нативный режим G5Процент захвата пакетовПроцент захвата пакетов в реальном времениПоказать точность калибровки за последние 3 дня
@@ -699,9 +699,9 @@
Продвинутые настройки G5 для редких ситуацийНастройки отладки G5/G6Некоторые устройства работают лучше когда постоянное сканирование включено, другие наоборот. Если опция отключена и показания с сенсора поступают стабильно, заряд батареи расходуется медленее. Рекомендуется включать эту опцию в случае проблем со стабильностью получения показаний
- Постоянный поиск G5
+ Искать G5 постоянноВажный параметр для правильного подключения на некоторых Android устройствах, но может привести к пропускам считанных показаний в случае возникновения других ресурсоемких операций с пользовательским интерфейсом.
- Приоритезация G5 сервиса
+ Принудительно G5 в поток UIАутентификация G5 перед каждым считываниемПриложение будет пытаться произвести полную аутентификацию перед каждым считыванием. Необходимо для новых прошивок G5.Отвязать G5 перед каждым считыванием
@@ -1183,7 +1183,7 @@
Загружать пользовательские значенияОтобразить уведомление и подать звуковой сигнал, если загрузка данных в Nightscout не удалась.Оповещение о сбоях
- Для G5 - отправляет в Nightscout данные об используемой службе сбора данных (например, OB1) и статус \'обратного заполнения\' данных (для нативного режима)
+ Для G5 отправляет тип коллектора (напр. OB1) и состояние заполнения показания из истории (для нативного) в Nigthscout.Добавлять информацию об источнике к имени устройстваНажмите, чтобы отправить данные истории в NightscoutОтправить историю
@@ -1341,7 +1341,7 @@
Разрешить отвязку OB1Служба сбора данных OB1 может инициировать подключение.Разрешить OB1 сопряжение
- Настройки старой версии службы сбора данных G5
+ Настройки старого коллектора G5Настройки батареи G5/G6Настройки предупреждений о состоянии батареиФункции и дополнения
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 1d20c6dfc2..9d16251821 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -39,6 +39,10 @@
Cloud StorageAuto configureAuto configure using a barcode.
+ Camera
+ Scan a QR code with your mobile (recommended)
+ Image file
+ You can save a QR code as an image file (such as .png or .jpeg) on your mobile. Then, use this option to scan the QR code from the saved file.Scan Share BarcodeOr scan the barcode on the share receiver
@@ -130,6 +134,7 @@
xDrip+ Update AvailableShare Settings via QR codeSend Feedback to Jamorham
+ Save LogsParakeet MapDisplay Preferences
@@ -414,7 +419,9 @@
Please enter your question or comments here.\n\nIf you supply an email address you may get a response.\n\nOptional contact info here, e.g. emailSend Message
+ Save LogsPlease indicate what you think of the app generally
+ Warning!\nThe logs may contain confidential information such as passwords or user IDs.Preferences saved in Internal storage/DownloadCouldn\'t write to SD card - check permissions?Loaded Preferences! - Restarting
@@ -621,7 +628,7 @@
Show a shortcut in the ☰ menu to toggle Speak ReadingsSpeak Readings ShortcutOn Android 6+ ensure battery optimization is switched off (recommended).
- Don\'t keep asking about battery optimization (not recommended).
+ Will not keep asking about battery optimization when enabled (not recommended).Battery Optimization promptAdvanced Bluetooth SettingsBluetooth Settings
diff --git a/app/src/main/res/xml/pref_advanced_settings.xml b/app/src/main/res/xml/pref_advanced_settings.xml
index 60563ab746..292dcd968e 100644
--- a/app/src/main/res/xml/pref_advanced_settings.xml
+++ b/app/src/main/res/xml/pref_advanced_settings.xml
@@ -1494,8 +1494,7 @@
+
-
-
-
-
-
diff --git a/app/src/main/res/xml/pref_data_sync.xml b/app/src/main/res/xml/pref_data_sync.xml
index 711934a994..e5e99bcc47 100644
--- a/app/src/main/res/xml/pref_data_sync.xml
+++ b/app/src/main/res/xml/pref_data_sync.xml
@@ -8,9 +8,18 @@
android:title="@string/data_sync">
+ android:title="@string/auto_configure_title">
+
+
+