diff --git a/app/src/main/java/com/eveningoutpost/dexdrip/StartNewSensor.java b/app/src/main/java/com/eveningoutpost/dexdrip/StartNewSensor.java index 668716b267..7ceaf3f5df 100644 --- a/app/src/main/java/com/eveningoutpost/dexdrip/StartNewSensor.java +++ b/app/src/main/java/com/eveningoutpost/dexdrip/StartNewSensor.java @@ -1,5 +1,10 @@ package com.eveningoutpost.dexdrip; +import static com.eveningoutpost.dexdrip.Home.startWatchUpdaterService; +import static com.eveningoutpost.dexdrip.Models.BgReading.AGE_ADJUSTMENT_TIME; +import static com.eveningoutpost.dexdrip.Services.Ob1G5CollectionService.getTransmitterID; +import static com.eveningoutpost.dexdrip.xdrip.gs; + import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; @@ -13,6 +18,8 @@ import android.widget.Toast; import com.eveningoutpost.dexdrip.G5Model.DexSyncKeeper; +import com.eveningoutpost.dexdrip.G5Model.DexTimeKeeper; +import com.eveningoutpost.dexdrip.G5Model.FirmwareCapability; import com.eveningoutpost.dexdrip.G5Model.Ob1G5StateMachine; import com.eveningoutpost.dexdrip.Models.JoH; import com.eveningoutpost.dexdrip.Models.Sensor; @@ -27,6 +34,7 @@ import com.eveningoutpost.dexdrip.profileeditor.ProfileAdapter; import com.eveningoutpost.dexdrip.profileeditor.TimePickerFragment; import com.eveningoutpost.dexdrip.ui.dialog.G6CalibrationCodeDialog; +import com.eveningoutpost.dexdrip.ui.dialog.G6EndOfLifeDialog; import com.eveningoutpost.dexdrip.utils.ActivityWithMenu; import com.eveningoutpost.dexdrip.utils.DexCollectionType; import com.eveningoutpost.dexdrip.utils.LocationHelper; @@ -36,9 +44,7 @@ import java.util.Date; import java.util.Locale; -import static com.eveningoutpost.dexdrip.Home.startWatchUpdaterService; -import static com.eveningoutpost.dexdrip.Models.BgReading.AGE_ADJUSTMENT_TIME; -import static com.eveningoutpost.dexdrip.xdrip.gs; +import lombok.val; public class StartNewSensor extends ActivityWithMenu { // public static String menu_name = "Start Sensor"; @@ -164,12 +170,27 @@ public void onTimeUpdated(int newmins) { timePickerFragment.show(activity.getFragmentManager(), "TimePicker"); } + private static final int ABSOLUTE_MAX_AGE_DAYS = 180; + private static final int MAX_AGE_DAYS = 100; + private static final int MONTH_WARNING_DAYS = 30; + private void startSensorOrAskForG6Code() { final int cap = 20; if (Ob1G5CollectionService.usingCollector() && Ob1G5StateMachine.usingG6()) { if (JoH.pratelimit("dex-stop-start", cap)) { JoH.clearRatelimit("dex-stop-start"); - G6CalibrationCodeDialog.ask(this, this::startSensorAndSetIntent); + val transmitterAgeInDays = DexTimeKeeper.getTransmitterAgeInDays(getTransmitterID()); + val modified = FirmwareCapability.isTransmitterModified(getTransmitterID()); + val endOfLife = transmitterAgeInDays >= ABSOLUTE_MAX_AGE_DAYS || (!modified && transmitterAgeInDays >= MAX_AGE_DAYS); + if (transmitterAgeInDays < MAX_AGE_DAYS - MONTH_WARNING_DAYS + || (modified && transmitterAgeInDays < ABSOLUTE_MAX_AGE_DAYS - MONTH_WARNING_DAYS)) { + // More than 30 days left of starting sensors - just ask for code + G6CalibrationCodeDialog.ask(this, this::startSensorAndSetIntent); + } else { // 30 or less days left of starting sensors - give additional message first + G6EndOfLifeDialog.show(activity, () -> + G6CalibrationCodeDialog.ask(this, this::startSensorAndSetIntent), + endOfLife, modified, transmitterAgeInDays); + } } else { JoH.static_toast_long(String.format(Locale.ENGLISH, getString(R.string.please_wait_seconds_before_trying_to_start_sensor), cap)); } diff --git a/app/src/main/java/com/eveningoutpost/dexdrip/ui/dialog/G6EndOfLifeDialog.java b/app/src/main/java/com/eveningoutpost/dexdrip/ui/dialog/G6EndOfLifeDialog.java new file mode 100644 index 0000000000..2145ada377 --- /dev/null +++ b/app/src/main/java/com/eveningoutpost/dexdrip/ui/dialog/G6EndOfLifeDialog.java @@ -0,0 +1,49 @@ +package com.eveningoutpost.dexdrip.ui.dialog; + +import android.app.Activity; +import android.app.AlertDialog; + +import com.eveningoutpost.dexdrip.R; + +// Navid200 + +public class G6EndOfLifeDialog { + + private static final int MAX_START_DAYS = 99; + + // Inform the user that Transmitter Days is approaching maximum, or that it has passed. + public static void show(final Activity activity, final Runnable runnable, final boolean endOfLife, final boolean modified, final int currentDays) { + String title = activity.getString(R.string.reminder); + String message; + if (endOfLife) { // Cannot start sensors + title = activity.getString(R.string.notification); + message = activity.getString(R.string.TX_EOL_notification); + } else { // Approaching end of life + if (modified) { // modified transmitter + message = activity.getString(R.string.TX_EOL_reminder_mod, currentDays); + } else { + message = activity.getString(R.string.TX_EOL_reminder, MAX_START_DAYS, currentDays); + } + } + final android.app.AlertDialog.Builder builder = new android.app.AlertDialog.Builder(activity) + .setTitle(title) + .setMessage(message); + + builder.setPositiveButton(R.string.proceed, (dialog, which) -> runnable.run()); + + if (endOfLife) { + builder.setNegativeButton(R.string.cancel, (dialog, which) -> dialog.cancel()); + } + + final AlertDialog dialog = builder.create(); + // apparently possible dialog is already showing, probably due to hash code + try { + if (dialog.isShowing()) { + dialog.dismiss(); + } + } catch (Exception e) { + // + } + dialog.show(); + } +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8aaabf4faa..79e6eb2bc6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1707,6 +1707,12 @@ Source Wizard Button Please wait %d seconds before trying to start sensor please update OOP2 or move to calibrate based on raw mode + Reminder + Notification + When Transmitter Days on system status page reaches %1$d, it will be the last opportunity to start a sensor on this transmitter. Currently at %2$d days. + If you proceed and start sensor, it is very likely it will fail because of Transmitter Days having reached maximum. + Transmitter Days is approaching maximum. Soon, you will not be able to start sensors on this transmitter. Currently at %d days. + Proceed Special Pairing Workaround Save Power Reduce battery and network overhead by using batch processing and excluding unnecessary data