diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index b571e247c2..6318d88e46 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -23,6 +23,7 @@
+
@@ -264,6 +265,8 @@
alertLiveData = new MutableLiveData<>();
private Thread thread;
- private InsightAlertActivity alertActivity;
- private Ringtone ringtone;
private Vibrator vibrator;
private boolean vibrating;
private InsightConnectionService connectionService;
@@ -65,27 +68,6 @@ public class InsightAlertService extends Service implements InsightConnectionSer
}
};
- private void retrieveRingtone() {
- Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
- ringtone = RingtoneManager.getRingtone(this, uri);
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
- ringtone.setAudioAttributes(new AudioAttributes.Builder()
- .setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
- .setContentType(AudioAttributes.CONTENT_TYPE_UNKNOWN)
- .setLegacyStreamType(AudioManager.STREAM_RING).build());
- } else ringtone.setStreamType(AudioManager.STREAM_RING);
- }
-
- public Alert getAlert() {
- synchronized ($alertLock) {
- return alert;
- }
- }
-
- public void setAlertActivity(InsightAlertActivity alertActivity) {
- this.alertActivity = alertActivity;
- }
-
public void ignore(AlertType alertType) {
synchronized ($alertLock) {
if (alertType == null) {
@@ -98,6 +80,10 @@ public class InsightAlertService extends Service implements InsightConnectionSer
}
}
+ public MutableLiveData getAlertLiveData() {
+ return alertLiveData;
+ }
+
@Nullable
@Override
public IBinder onBind(Intent intent) {
@@ -108,6 +94,7 @@ public class InsightAlertService extends Service implements InsightConnectionSer
public void onCreate() {
vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
bindService(new Intent(this, InsightConnectionService.class), serviceConnection, BIND_AUTO_CREATE);
+ alertLiveData.setValue(null);
}
@Override
@@ -118,6 +105,12 @@ public class InsightAlertService extends Service implements InsightConnectionSer
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
+ if ("mute".equals(intent.getStringExtra("command"))) {
+ mute();
+ } else if ("confirm".equals(intent.getStringExtra("command"))) {
+ dismissNotification();
+ confirm();
+ }
return START_STICKY;
}
@@ -127,25 +120,47 @@ public class InsightAlertService extends Service implements InsightConnectionSer
thread = new Thread(this::queryActiveAlert);
thread.start();
- } else if (thread != null) thread.interrupt();
+ } else {
+ dismissNotification();
+ if (thread != null) thread.interrupt();
+ }
}
private void queryActiveAlert() {
while (!Thread.currentThread().isInterrupted()) {
try {
Alert alert = connectionService.requestMessage(new GetActiveAlertMessage()).await().getAlert();
- if (Thread.currentThread().isInterrupted()) {
- connectionService.withdrawConnectionRequest(thread);
- break;
- }
synchronized ($alertLock) {
- if ((this.alert == null && alert != null)
+ if (alert == null || (alert.getAlertType() == ignoreType && System.currentTimeMillis() - ignoreTimestamp < 10000)) {
+ if (connectionRequested) {
+ connectionService.withdrawConnectionRequest(this);
+ connectionRequested = false;
+ }
+ this.alertLiveData.postValue(null);
+ this.alert = null;
+ dismissNotification();
+ stopAlerting();
+ } else if (!alert.equals(this.alert)) {
+ if (!connectionRequested) {
+ connectionService.requestConnection(this);
+ connectionRequested = true;
+ }
+ showNotification(alert);
+ this.alertLiveData.postValue(alert);
+ this.alert = alert;
+ if (alert.getAlertStatus() == AlertStatus.SNOOZED) stopAlerting();
+ else alert();
+ }
+ /*if ((this.alert == null && alert != null)
|| (this.alert != null && alert == null)
|| (this.alert != null && alert != null && !this.alert.equals(alert))) {
if (this.alert != null && (alert == null || this.alert.getAlertId() != alert.getAlertId())) stopAlerting();
this.alert = alert;
- if (alertActivity != null && alert != null)
- new Handler(Looper.getMainLooper()).post(() -> alertActivity.update(alert));
+ if (alert != null)
+ new Handler(Looper.getMainLooper()).post(() -> {
+ //showNotification(alert);
+ //alertActivity.update(alert);
+ });
}
if (alert == null) {
stopAlerting();
@@ -153,8 +168,10 @@ public class InsightAlertService extends Service implements InsightConnectionSer
connectionService.withdrawConnectionRequest(this);
connectionRequested = false;
}
- if (alertActivity != null)
- new Handler(Looper.getMainLooper()).post(() -> alertActivity.finish());
+ new Handler(Looper.getMainLooper()).post(() -> {
+ //dismissNotification();
+ //alertActivity.finish();
+ });
} else if (!(alert.getAlertType() == ignoreType && System.currentTimeMillis() - ignoreTimestamp < 10000)) {
if (alert.getAlertStatus() == AlertStatus.ACTIVE) alert();
else stopAlerting();
@@ -162,12 +179,12 @@ public class InsightAlertService extends Service implements InsightConnectionSer
connectionService.requestConnection(this);
connectionRequested = true;
}
- if (alertActivity == null) {
+ /*if (alertActivity == null) {
Intent intent = new Intent(InsightAlertService.this, InsightAlertActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
new Handler(Looper.getMainLooper()).post(() -> startActivity(intent));
- }
- }
+ }*/
+ //}
}
} catch (InterruptedException ignored) {
connectionService.withdrawConnectionRequest(thread);
@@ -189,21 +206,18 @@ public class InsightAlertService extends Service implements InsightConnectionSer
connectionService.withdrawConnectionRequest(thread);
connectionRequested = false;
}
- if (alertActivity != null)
- new Handler(Looper.getMainLooper()).post(() -> alertActivity.finish());
stopAlerting();
+ alertLiveData.postValue(null);
+ this.alert = null;
+ dismissNotification();
thread = null;
}
private void alert() {
if (!vibrating) {
- vibrator.vibrate(new long[] {0, 1000, 1000}, 0);
+ vibrator.vibrate(new long[]{0, 1000, 1000}, 0);
vibrating = true;
}
- if (ringtone == null || !ringtone.isPlaying()) {
- retrieveRingtone();
- ringtone.play();
- }
}
private void stopAlerting() {
@@ -211,15 +225,21 @@ public class InsightAlertService extends Service implements InsightConnectionSer
vibrator.cancel();
vibrating = false;
}
- if (ringtone != null && ringtone.isPlaying()) ringtone.stop();
}
public void mute() {
new Thread(() -> {
try {
- SnoozeAlertMessage snoozeAlertMessage = new SnoozeAlertMessage();
- snoozeAlertMessage.setAlertID(alert.getAlertId());
- connectionService.requestMessage(snoozeAlertMessage).await();
+ synchronized ($alertLock) {
+ if (alert == null) return;
+ alert.setAlertStatus(AlertStatus.SNOOZED);
+ alertLiveData.postValue(alert);
+ stopAlerting();
+ showNotification(alert);
+ SnoozeAlertMessage snoozeAlertMessage = new SnoozeAlertMessage();
+ snoozeAlertMessage.setAlertID(alertLiveData.getValue().getAlertId());
+ connectionService.requestMessage(snoozeAlertMessage).await();
+ }
} catch (AppLayerErrorException e) {
log.info("Exception while muting alert: " + e.getClass().getCanonicalName() + " (" + e.getErrorCode() + ")");
ExceptionTranslator.makeToast(InsightAlertService.this, e);
@@ -236,9 +256,16 @@ public class InsightAlertService extends Service implements InsightConnectionSer
public void confirm() {
new Thread(() -> {
try {
- ConfirmAlertMessage confirmAlertMessage = new ConfirmAlertMessage();
- confirmAlertMessage.setAlertID(alert.getAlertId());
- connectionService.requestMessage(confirmAlertMessage).await();
+ synchronized ($alertLock) {
+ if (alert == null) return;
+ stopAlerting();
+ alertLiveData.postValue(null);
+ dismissNotification();
+ ConfirmAlertMessage confirmAlertMessage = new ConfirmAlertMessage();
+ confirmAlertMessage.setAlertID(alertLiveData.getValue().getAlertId());
+ connectionService.requestMessage(confirmAlertMessage).await();
+ this.alert = null;
+ }
} catch (AppLayerErrorException e) {
log.info("Exception while confirming alert: " + e.getClass().getCanonicalName() + " (" + e.getErrorCode() + ")");
ExceptionTranslator.makeToast(InsightAlertService.this, e);
@@ -252,6 +279,48 @@ public class InsightAlertService extends Service implements InsightConnectionSer
}).start();
}
+ private void showNotification(Alert alert) {
+ NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, LocalInsightPlugin.ALERT_CHANNEL_ID);
+
+ notificationBuilder.setPriority(NotificationCompat.PRIORITY_MAX);
+ notificationBuilder.setCategory(NotificationCompat.CATEGORY_ALARM);
+ notificationBuilder.setVibrate(new long[0]);
+ notificationBuilder.setShowWhen(false);
+ notificationBuilder.setOngoing(true);
+ notificationBuilder.setOnlyAlertOnce(true);
+ notificationBuilder.setAutoCancel(false);
+ notificationBuilder.setSmallIcon(AlertUtilsKt.getAlertIcon(alert.getAlertCategory()));
+
+ notificationBuilder.setContentTitle(AlertUtilsKt.getAlertCode(alert.getAlertType()) + " – " + AlertUtilsKt.getAlertTitle(alert.getAlertType()));
+ String description = AlertUtilsKt.getAlertDescription(alert);
+ if (description != null)
+ notificationBuilder.setContentText(Html.fromHtml(description).toString());
+
+ Intent fullScreenIntent = new Intent(this, InsightAlertActivity.class);
+ PendingIntent fullScreenPendingIntent = PendingIntent.getActivity(this, 0, fullScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT);
+ notificationBuilder.setFullScreenIntent(fullScreenPendingIntent, true);
+
+ switch (alert.getAlertStatus()) {
+ case ACTIVE:
+ Intent muteIntent = new Intent(this, InsightAlertService.class).putExtra("command", "mute");
+ PendingIntent mutePendingIntent = PendingIntent.getService(this, 1, muteIntent, PendingIntent.FLAG_UPDATE_CURRENT);
+ notificationBuilder.addAction(0, MainApp.gs(R.string.mute_alert), mutePendingIntent);
+ case SNOOZED:
+ Intent confirmIntent = new Intent(this, InsightAlertService.class).putExtra("command", "confirm");
+ PendingIntent confirmPendingIntent = PendingIntent.getService(this, 2, confirmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
+ notificationBuilder.addAction(0, MainApp.gs(R.string.confirm), confirmPendingIntent);
+ }
+
+ Notification notification = notificationBuilder.build();
+ NotificationManagerCompat.from(this).notify(NOTIFICATION_ID, notification);
+ startForeground(NOTIFICATION_ID, notification);
+ }
+
+ private void dismissNotification() {
+ NotificationManagerCompat.from(this).cancel(NOTIFICATION_ID);
+ stopForeground(true);
+ }
+
public class LocalBinder extends Binder {
public InsightAlertService getService() {
return InsightAlertService.this;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/insight/LocalInsightPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/insight/LocalInsightPlugin.java
index 2197b48577..66ee0bed5a 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/insight/LocalInsightPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/insight/LocalInsightPlugin.java
@@ -1,9 +1,12 @@
package info.nightscout.androidaps.plugins.pump.insight;
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
+import android.os.Build;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
@@ -132,6 +135,8 @@ import info.nightscout.androidaps.utils.SP;
public class LocalInsightPlugin extends PluginBase implements PumpInterface, ConstraintsInterface, InsightConnectionService.StateCallback {
+ public static final String ALERT_CHANNEL_ID = "AndroidAPS-InsightAlert";
+
private static LocalInsightPlugin instance = null;
private Logger log = LoggerFactory.getLogger(L.PUMP);
@@ -245,6 +250,15 @@ public class LocalInsightPlugin extends PluginBase implements PumpInterface, Con
super.onStart();
MainApp.instance().bindService(new Intent(MainApp.instance(), InsightConnectionService.class), serviceConnection, Context.BIND_AUTO_CREATE);
MainApp.instance().bindService(new Intent(MainApp.instance(), InsightAlertService.class), serviceConnection, Context.BIND_AUTO_CREATE);
+ createNotificationChannel();
+ }
+
+ private void createNotificationChannel() {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ NotificationManager notificationManager = (NotificationManager) MainApp.instance().getSystemService(Context.NOTIFICATION_SERVICE);
+ NotificationChannel channel = new NotificationChannel(ALERT_CHANNEL_ID, MainApp.gs(R.string.insight_alert_notification_channel), NotificationManager.IMPORTANCE_HIGH);
+ notificationManager.createNotificationChannel(channel);
+ }
}
@Override
@@ -647,6 +661,7 @@ public class LocalInsightPlugin extends PluginBase implements PumpInterface, Con
cancelBolusMessage.setBolusID(bolusID);
connectionService.requestMessage(cancelBolusMessage).await();
bolusCancelled = true;
+ alertService.ignore(null);
}
confirmAlert(AlertType.WARNING_38);
} catch (AppLayerErrorException e) {
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/insight/activities/InsightAlertActivity.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/insight/activities/InsightAlertActivity.java
index 77be3ab03a..8ebd05801b 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/insight/activities/InsightAlertActivity.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/insight/activities/InsightAlertActivity.java
@@ -12,19 +12,18 @@ import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
+import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
-import java.text.DecimalFormat;
-
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.activities.NoSplashAppCompatActivity;
import info.nightscout.androidaps.plugins.pump.insight.InsightAlertService;
import info.nightscout.androidaps.plugins.pump.insight.descriptors.Alert;
import info.nightscout.androidaps.plugins.pump.insight.descriptors.AlertStatus;
+import info.nightscout.androidaps.plugins.pump.insight.utils.AlertUtilsKt;
-public class InsightAlertActivity extends NoSplashAppCompatActivity {
+public class InsightAlertActivity extends AppCompatActivity {
- private Alert alert;
private InsightAlertService alertService;
private ImageView icon;
@@ -38,10 +37,10 @@ public class InsightAlertActivity extends NoSplashAppCompatActivity {
@Override
public void onServiceConnected(ComponentName name, IBinder binder) {
alertService = ((InsightAlertService.LocalBinder) binder).getService();
- alertService.setAlertActivity(InsightAlertActivity.this);
- alert = alertService.getAlert();
- if (alert == null) finish();
- else update(alert);
+ alertService.getAlertLiveData().observe(InsightAlertActivity.this, alert -> {
+ if (alert == null) finish();
+ else update(alert);
+ });
}
@Override
@@ -70,174 +69,22 @@ public class InsightAlertActivity extends NoSplashAppCompatActivity {
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
- WindowManager.LayoutParams layoutParams = getWindow().getAttributes();
- layoutParams.screenBrightness = 1.0F;
- getWindow().setAttributes(layoutParams);
}
@Override
protected void onDestroy() {
- alertService.setAlertActivity(null);
unbindService(serviceConnection);
super.onDestroy();
}
public void update(Alert alert) {
- this.alert = alert;
mute.setEnabled(true);
mute.setVisibility(alert.getAlertStatus() == AlertStatus.SNOOZED ? View.GONE : View.VISIBLE);
confirm.setEnabled(true);
- int icon = 0;
- int code = 0;
- int title = 0;
- String description = null;
- switch (alert.getAlertCategory()) {
- case ERROR:
- icon = R.drawable.ic_error;
- break;
- case MAINTENANCE:
- icon = R.drawable.ic_maintenance;
- break;
- case WARNING:
- icon = R.drawable.ic_warning;
- break;
- case REMINDER:
- icon = R.drawable.ic_reminder;
- break;
- }
- DecimalFormat decimalFormat = new DecimalFormat("##0.00");
- int hours = alert.getTBRDuration() / 60;
- int minutes = alert.getTBRDuration() - hours * 60;
- switch (alert.getAlertType()) {
- case REMINDER_01:
- code = R.string.alert_r1_code;
- title = R.string.alert_r1_title;
- break;
- case REMINDER_02:
- code = R.string.alert_r2_code;
- title = R.string.alert_r2_title;
- break;
- case REMINDER_03:
- code = R.string.alert_r3_code;
- title = R.string.alert_r3_title;
- break;
- case REMINDER_04:
- code = R.string.alert_r4_code;
- title = R.string.alert_r4_title;
- break;
- case REMINDER_07:
- code = R.string.alert_r7_code;
- title = R.string.alert_r7_title;
- description = getString(R.string.alert_r7_description, alert.getTBRAmount(), new DecimalFormat("#0").format(hours) + ":" + new DecimalFormat("00").format(minutes));
- break;
- case WARNING_31:
- code = R.string.alert_w31_code;
- title = R.string.alert_w31_title;
- description = getString(R.string.alert_w31_description, decimalFormat.format(alert.getCartridgeAmount()));
- break;
- case WARNING_32:
- code = R.string.alert_w32_code;
- title = R.string.alert_w32_title;
- description = getString(R.string.alert_w32_description);
- break;
- case WARNING_33:
- code = R.string.alert_w33_code;
- title = R.string.alert_w33_title;
- description = getString(R.string.alert_w33_description);
- break;
- case WARNING_34:
- code = R.string.alert_w34_code;
- title = R.string.alert_w34_title;
- description = getString(R.string.alert_w34_description);
- break;
- case WARNING_36:
- code = R.string.alert_w36_code;
- title = R.string.alert_w36_title;
- description = getString(R.string.alert_w36_description, alert.getTBRAmount(), new DecimalFormat("#0").format(hours) + ":" + new DecimalFormat("00").format(minutes));
- break;
- case WARNING_38:
- code = R.string.alert_w38_code;
- title = R.string.alert_w38_title;
- description = getString(R.string.alert_w38_description, decimalFormat.format(alert.getProgrammedBolusAmount()), decimalFormat.format(alert.getDeliveredBolusAmount()));
- break;
- case WARNING_39:
- code = R.string.alert_w39_code;
- title = R.string.alert_w39_title;
- break;
- case MAINTENANCE_20:
- code = R.string.alert_m20_code;
- title = R.string.alert_m20_title;
- description = getString(R.string.alert_m20_description);
- break;
- case MAINTENANCE_21:
- code = R.string.alert_m21_code;
- title = R.string.alert_m21_title;
- description = getString(R.string.alert_m21_description);
- break;
- case MAINTENANCE_22:
- code = R.string.alert_m22_code;
- title = R.string.alert_m22_title;
- description = getString(R.string.alert_m22_description);
- break;
- case MAINTENANCE_23:
- code = R.string.alert_m23_code;
- title = R.string.alert_m23_title;
- description = getString(R.string.alert_m23_description);
- break;
- case MAINTENANCE_24:
- code = R.string.alert_m24_code;
- title = R.string.alert_m24_title;
- description = getString(R.string.alert_m24_description);
- break;
- case MAINTENANCE_25:
- code = R.string.alert_m25_code;
- title = R.string.alert_m25_title;
- description = getString(R.string.alert_m25_description);
- break;
- case MAINTENANCE_26:
- code = R.string.alert_m26_code;
- title = R.string.alert_m26_title;
- description = getString(R.string.alert_m26_description);
- break;
- case MAINTENANCE_27:
- code = R.string.alert_m27_code;
- title = R.string.alert_m27_title;
- description = getString(R.string.alert_m27_description);
- break;
- case MAINTENANCE_28:
- code = R.string.alert_m28_code;
- title = R.string.alert_m28_title;
- description = getString(R.string.alert_m28_description);
- break;
- case MAINTENANCE_29:
- code = R.string.alert_m29_code;
- title = R.string.alert_m29_title;
- description = getString(R.string.alert_m29_description);
- break;
- case MAINTENANCE_30:
- code = R.string.alert_m30_code;
- title = R.string.alert_m30_title;
- description = getString(R.string.alert_m30_description);
- break;
- case ERROR_6:
- code = R.string.alert_e6_code;
- title = R.string.alert_e6_title;
- description = getString(R.string.alert_e6_description);
- break;
- case ERROR_10:
- code = R.string.alert_e10_code;
- title = R.string.alert_e10_title;
- description = getString(R.string.alert_e10_description);
- break;
- case ERROR_13:
- code = R.string.alert_e13_code;
- title = R.string.alert_e13_title;
- description = getString(R.string.alert_e13_description);
- break;
- }
- this.icon.setImageDrawable(ContextCompat.getDrawable(this, icon));
- this.errorCode.setText(code);
- this.errorTitle.setText(title);
+ this.icon.setImageDrawable(ContextCompat.getDrawable(this, AlertUtilsKt.getAlertIcon(alert.getAlertCategory())));
+ this.errorCode.setText(AlertUtilsKt.getAlertCode(alert.getAlertType()));
+ this.errorTitle.setText(AlertUtilsKt.getAlertTitle(alert.getAlertType()));
+ String description = AlertUtilsKt.getAlertDescription(alert);
if (description == null) this.errorDescription.setVisibility(View.GONE);
else {
this.errorDescription.setVisibility(View.VISIBLE);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/insight/descriptors/Alert.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/insight/descriptors/Alert.java
index 8f6668c1ca..028fcb3b71 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/insight/descriptors/Alert.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/insight/descriptors/Alert.java
@@ -83,4 +83,24 @@ public class Alert {
public double getCartridgeAmount() {
return cartridgeAmount;
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ Alert alert = (Alert) o;
+
+ if (alertId != alert.alertId) return false;
+ if (tbrAmount != alert.tbrAmount) return false;
+ if (tbrDuration != alert.tbrDuration) return false;
+ if (Double.compare(alert.programmedBolusAmount, programmedBolusAmount) != 0)
+ return false;
+ if (Double.compare(alert.deliveredBolusAmount, deliveredBolusAmount) != 0)
+ return false;
+ if (Double.compare(alert.cartridgeAmount, cartridgeAmount) != 0) return false;
+ if (alertCategory != alert.alertCategory) return false;
+ if (alertType != alert.alertType) return false;
+ return alertStatus == alert.alertStatus;
+ }
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/insight/utils/AlertUtils.kt b/app/src/main/java/info/nightscout/androidaps/plugins/pump/insight/utils/AlertUtils.kt
new file mode 100644
index 0000000000..7cafb950cc
--- /dev/null
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/insight/utils/AlertUtils.kt
@@ -0,0 +1,107 @@
+package info.nightscout.androidaps.plugins.pump.insight.utils
+
+import info.nightscout.androidaps.MainApp
+import info.nightscout.androidaps.R
+import info.nightscout.androidaps.plugins.pump.insight.descriptors.Alert
+import info.nightscout.androidaps.plugins.pump.insight.descriptors.AlertCategory
+import info.nightscout.androidaps.plugins.pump.insight.descriptors.AlertType
+import java.text.DecimalFormat
+
+fun getAlertCode(alertType: AlertType) = MainApp.gs(when (alertType) {
+ AlertType.REMINDER_01 -> R.string.alert_r1_code
+ AlertType.REMINDER_02 -> R.string.alert_r2_code
+ AlertType.REMINDER_03 -> R.string.alert_r3_code
+ AlertType.REMINDER_04 -> R.string.alert_r4_code
+ AlertType.REMINDER_07 -> R.string.alert_r7_code
+ AlertType.WARNING_31 -> R.string.alert_w31_code
+ AlertType.WARNING_32 -> R.string.alert_w32_code
+ AlertType.WARNING_33 -> R.string.alert_w33_code
+ AlertType.WARNING_34 -> R.string.alert_w34_code
+ AlertType.WARNING_36 -> R.string.alert_w36_code
+ AlertType.WARNING_38 -> R.string.alert_w38_code
+ AlertType.WARNING_39 -> R.string.alert_w39_code
+ AlertType.MAINTENANCE_20 -> R.string.alert_m20_code
+ AlertType.MAINTENANCE_21 -> R.string.alert_m21_code
+ AlertType.MAINTENANCE_22 -> R.string.alert_m22_code
+ AlertType.MAINTENANCE_23 -> R.string.alert_m23_code
+ AlertType.MAINTENANCE_24 -> R.string.alert_m24_code
+ AlertType.MAINTENANCE_25 -> R.string.alert_m25_code
+ AlertType.MAINTENANCE_26 -> R.string.alert_m26_code
+ AlertType.MAINTENANCE_27 -> R.string.alert_m27_code
+ AlertType.MAINTENANCE_28 -> R.string.alert_m28_code
+ AlertType.MAINTENANCE_29 -> R.string.alert_m29_code
+ AlertType.MAINTENANCE_30 -> R.string.alert_m30_code
+ AlertType.ERROR_6 -> R.string.alert_e6_code
+ AlertType.ERROR_10 -> R.string.alert_e10_code
+ AlertType.ERROR_13 -> R.string.alert_e13_code
+})
+
+fun getAlertTitle(alertType: AlertType) = MainApp.gs(when (alertType) {
+ AlertType.REMINDER_01 -> R.string.alert_r1_title
+ AlertType.REMINDER_02 -> R.string.alert_r2_title
+ AlertType.REMINDER_03 -> R.string.alert_r3_title
+ AlertType.REMINDER_04 -> R.string.alert_r4_title
+ AlertType.REMINDER_07 -> R.string.alert_r7_title
+ AlertType.WARNING_31 -> R.string.alert_w31_title
+ AlertType.WARNING_32 -> R.string.alert_w32_title
+ AlertType.WARNING_33 -> R.string.alert_w33_title
+ AlertType.WARNING_34 -> R.string.alert_w34_title
+ AlertType.WARNING_36 -> R.string.alert_w36_title
+ AlertType.WARNING_38 -> R.string.alert_w38_title
+ AlertType.WARNING_39 -> R.string.alert_w39_title
+ AlertType.MAINTENANCE_20 -> R.string.alert_m20_title
+ AlertType.MAINTENANCE_21 -> R.string.alert_m21_title
+ AlertType.MAINTENANCE_22 -> R.string.alert_m22_title
+ AlertType.MAINTENANCE_23 -> R.string.alert_m23_title
+ AlertType.MAINTENANCE_24 -> R.string.alert_m24_title
+ AlertType.MAINTENANCE_25 -> R.string.alert_m25_title
+ AlertType.MAINTENANCE_26 -> R.string.alert_m26_title
+ AlertType.MAINTENANCE_27 -> R.string.alert_m27_title
+ AlertType.MAINTENANCE_28 -> R.string.alert_m28_title
+ AlertType.MAINTENANCE_29 -> R.string.alert_m29_title
+ AlertType.MAINTENANCE_30 -> R.string.alert_m30_title
+ AlertType.ERROR_6 -> R.string.alert_e6_title
+ AlertType.ERROR_10 -> R.string.alert_e10_title
+ AlertType.ERROR_13 -> R.string.alert_e13_title
+})
+
+fun getAlertDescription(alert: Alert): String? {
+ val decimalFormat = DecimalFormat("##0.00")
+ val hours = alert.tbrDuration / 60
+ val minutes = alert.tbrDuration - hours * 60
+ return when (alert.alertType!!) {
+ AlertType.REMINDER_01 -> null
+ AlertType.REMINDER_02 -> null
+ AlertType.REMINDER_03 -> null
+ AlertType.REMINDER_04 -> null
+ AlertType.REMINDER_07 -> MainApp.gs(R.string.alert_r7_description, alert.tbrAmount, DecimalFormat("#0").format(hours.toLong()) + ":" + DecimalFormat("00").format(minutes.toLong()))
+ AlertType.WARNING_31 -> MainApp.gs(R.string.alert_w31_description, decimalFormat.format(alert.cartridgeAmount))
+ AlertType.WARNING_32 -> MainApp.gs(R.string.alert_w32_description)
+ AlertType.WARNING_33 -> MainApp.gs(R.string.alert_w33_description)
+ AlertType.WARNING_34 -> MainApp.gs(R.string.alert_w34_description)
+ AlertType.WARNING_36 -> MainApp.gs(R.string.alert_w36_description, alert.tbrAmount, DecimalFormat("#0").format(hours.toLong()) + ":" + DecimalFormat("00").format(minutes.toLong()))
+ AlertType.WARNING_38 -> MainApp.gs(R.string.alert_w38_description, decimalFormat.format(alert.programmedBolusAmount), decimalFormat.format(alert.deliveredBolusAmount))
+ AlertType.WARNING_39 -> null
+ AlertType.MAINTENANCE_20 -> MainApp.gs(R.string.alert_m20_description)
+ AlertType.MAINTENANCE_21 -> MainApp.gs(R.string.alert_m21_description)
+ AlertType.MAINTENANCE_22 -> MainApp.gs(R.string.alert_m22_description)
+ AlertType.MAINTENANCE_23 -> MainApp.gs(R.string.alert_m23_description)
+ AlertType.MAINTENANCE_24 -> MainApp.gs(R.string.alert_m24_description)
+ AlertType.MAINTENANCE_25 -> MainApp.gs(R.string.alert_m25_description)
+ AlertType.MAINTENANCE_26 -> MainApp.gs(R.string.alert_m26_description)
+ AlertType.MAINTENANCE_27 -> MainApp.gs(R.string.alert_m27_description)
+ AlertType.MAINTENANCE_28 -> MainApp.gs(R.string.alert_m28_description)
+ AlertType.MAINTENANCE_29 -> MainApp.gs(R.string.alert_m29_description)
+ AlertType.MAINTENANCE_30 -> MainApp.gs(R.string.alert_m30_description)
+ AlertType.ERROR_6 -> MainApp.gs(R.string.alert_e6_description)
+ AlertType.ERROR_10 -> MainApp.gs(R.string.alert_e10_description)
+ AlertType.ERROR_13 -> MainApp.gs(R.string.alert_e13_description)
+ }
+}
+
+fun getAlertIcon(alertCategory: AlertCategory) = when (alertCategory) {
+ AlertCategory.ERROR -> R.drawable.ic_error
+ AlertCategory.MAINTENANCE -> R.drawable.ic_maintenance
+ AlertCategory.WARNING -> R.drawable.ic_warning
+ AlertCategory.REMINDER -> R.drawable.ic_reminder
+}
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 2e06c2a027..a4c79cb63b 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1698,5 +1698,6 @@
SMB execution time
Temp basal request time
Temp basal execution time
+ Insight Pump Alerts
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index d2cacff3b7..d78df37ac4 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -27,12 +27,10 @@
- @android:style/Animation
-