Skip to content

Commit ce59722

Browse files
1.2.1: on/off switch for the lock screen pill
The settings get their own switch for the pill, marked experimental. It shows only when both the switch and the accessibility service are on; turning it on opens the accessibility settings if Android isn't running the service yet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 parent 971fdbc commit ce59722

12 files changed

Lines changed: 93 additions & 39 deletions

File tree

‎app/build.gradle‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ android {
1414
applicationId 'io.github.federicomameli1.sugarglass'
1515
minSdk 26
1616
targetSdk 34
17-
versionCode 6
18-
versionName '1.2.0'
17+
versionCode 7
18+
versionName '1.2.1'
1919
}
2020

2121
signingConfigs {

‎app/src/main/java/io/github/federicomameli1/sugarglass/GlucoseService.java‎

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,13 @@ public class GlucoseService extends Service {
6767
static volatile String status = "";
6868
/** Whether the last fetch failed, so the notification can say so without quoting the error. */
6969
static volatile boolean failing;
70-
/** Set by the lock screen pill while it runs: then the notification stays off the lock screen. */
70+
/** Set by the lock screen pill while Android runs it (turned on in Accessibility). */
7171
static volatile boolean pill;
72+
73+
/** The pill's own switch in the settings; it shows only when this and the accessibility service are on. */
74+
static boolean pillOn(Context context) {
75+
return prefs(context).getBoolean("lock_pill", true);
76+
}
7277
/** What the notification last showed that matters, so a dark screen isn't woken for an unchanged value. */
7378
private volatile String shown = "";
7479

@@ -357,7 +362,7 @@ private Notification notification() {
357362
.setOngoing(true)
358363
.setOnlyAlertOnce(true)
359364
.setShowWhen(false)
360-
.setVisibility(pill ? Notification.VISIBILITY_SECRET : Notification.VISIBILITY_PUBLIC)
365+
.setVisibility(pill && pillOn(this) ? Notification.VISIBILITY_SECRET : Notification.VISIBILITY_PUBLIC)
361366
.setContentIntent(PendingIntent.getActivity(this, 0,
362367
new Intent(this, MainActivity.class), PendingIntent.FLAG_IMMUTABLE));
363368
List<Glucose.Reading> r = readings;

‎app/src/main/java/io/github/federicomameli1/sugarglass/LockPill.java‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import java.util.List;
2323

2424
/**
25-
* Experimental, off unless turned on in Accessibility: a small pill with the value and arrow at the bottom of the lock
25+
* Experimental, off unless turned on in Accessibility and in the settings: a small pill with the value and arrow at the bottom of the lock
2626
* screen. Apps cannot draw there; an accessibility overlay can. It reads nothing on screen
2727
* (no window content in its config), it only draws, and it never takes touches.
2828
*/
@@ -108,7 +108,7 @@ public void onDestroy() {
108108
private void check() {
109109
boolean locked = locked();
110110
List<Glucose.Reading> r = GlucoseService.readings;
111-
if (!locked || pin || covered || r.isEmpty()) {
111+
if (!locked || pin || covered || !GlucoseService.pillOn(this) || r.isEmpty()) {
112112
hide();
113113
return;
114114
}

‎app/src/main/java/io/github/federicomameli1/sugarglass/SettingsActivity.java‎

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ public class SettingsActivity extends Activity {
6060
private CheckBox previewFixed;
6161
private EditText previewBottom, previewTop;
6262
private boolean previewMmol;
63+
private CheckBox pillBox;
64+
private boolean syncing; // the pill box is being set from code, not tapped
6365

6466
@Override
6567
protected void attachBaseContext(Context base) {
@@ -325,18 +327,37 @@ public void afterTextChanged(android.text.Editable e) {
325327
applied();
326328
drawPreview();
327329
});
328-
// The lock screen pill is switched on in Android's accessibility settings, not here
329-
page.addView(label(R.string.lock_pill_title));
330+
// Lock screen pill: its own switch here, but Android must also run it as an accessibility service,
331+
// which only the user can turn on. The box shows on only when both are
332+
LinearLayout pillTitle = new LinearLayout(this);
333+
pillTitle.setGravity(Gravity.BOTTOM);
334+
pillTitle.addView(label(R.string.lock_pill_title));
335+
TextView experimental = text(11, getColor(R.color.range_warn));
336+
experimental.setText(R.string.experimental);
337+
experimental.setTypeface(android.graphics.Typeface.DEFAULT_BOLD);
338+
experimental.setPadding(dp(8), 0, 0, dp(1));
339+
pillTitle.addView(experimental);
340+
page.addView(pillTitle);
341+
pillBox = new CheckBox(this);
342+
pillBox.setText(R.string.lock_pill_switch);
343+
syncPill();
344+
pillBox.setOnCheckedChangeListener((box, on) -> {
345+
if (syncing) return;
346+
p.edit().putBoolean("lock_pill", on).apply();
347+
applied();
348+
if (on && !GlucoseService.pill) {
349+
Toast.makeText(this, R.string.lock_pill_turn_on, Toast.LENGTH_LONG).show();
350+
try {
351+
startActivity(new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS));
352+
} catch (RuntimeException e) {
353+
// nothing to open on this phone
354+
}
355+
}
356+
});
357+
page.addView(pillBox);
330358
TextView pillNote = text(13, secondary);
331359
pillNote.setText(R.string.lock_pill_note);
332360
page.addView(pillNote);
333-
button(R.string.lock_pill_open, () -> {
334-
try {
335-
startActivity(new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS));
336-
} catch (RuntimeException e) {
337-
// nothing to open on this phone
338-
}
339-
});
340361

341362
// Look, glow and switches already show while you change them; Save stores the typed scale and closes
342363
button(R.string.save_short, () -> {
@@ -500,6 +521,18 @@ private void saved() {
500521
}
501522

502523
/** Widgets and notification redraw with what was just saved. */
524+
@Override
525+
protected void onResume() {
526+
super.onResume();
527+
if (pillBox != null) syncPill(); // back from the accessibility settings
528+
}
529+
530+
private void syncPill() {
531+
syncing = true;
532+
pillBox.setChecked(GlucoseService.pill && GlucoseService.pillOn(this));
533+
syncing = false;
534+
}
535+
503536
private void applied() {
504537
GlucoseWidget.updateAll(this);
505538
GlucoseService.start(this);

‎app/src/main/res/values-de/strings.xml‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,9 @@
4848
<string name="example">Beispiel</string>
4949
<string name="lock_pill">Sugarglass-Pille auf dem Sperrbildschirm</string>
5050
<string name="lock_pill_description">Zeigt den letzten Wert und den Pfeil unten auf dem Sperrbildschirm. Sie zeichnet nur: Sie liest den Bildschirm nicht und drückt nichts.</string>
51-
<string name="lock_pill_title">Pille auf dem Sperrbildschirm (experimentell)</string>
52-
<string name="lock_pill_note">Zeigt Wert und Pfeil unten auf dem Sperrbildschirm und nimmt die Benachrichtigung von dort weg. Aktiviere \"Sugarglass-Pille auf dem Sperrbildschirm\" unter Bedienungshilfen (manchmal unter Heruntergeladene Apps). Ist sie ausgegraut, erlaube zuerst eingeschränkte Einstellungen im Menü der App-Info. Sie zeichnet nur: Sie liest den Bildschirm nicht.</string>
53-
<string name="lock_pill_open">Bedienungshilfen öffnen</string>
51+
<string name="lock_pill_title">Pille auf dem Sperrbildschirm</string>
52+
<string name="lock_pill_note">Android lässt keine App auf dem Sperrbildschirm zeichnen, deshalb läuft die Pille als Bedienungshilfe: Schalte beim ersten Mal \"Sugarglass-Pille auf dem Sperrbildschirm\" unter Bedienungshilfen ein (manchmal unter Heruntergeladene Apps). Ist sie ausgegraut, erlaube zuerst eingeschränkte Einstellungen im Menü der App-Info. Sie zeichnet nur: Sie liest den Bildschirm nicht. Solange sie angezeigt wird, bleibt die Benachrichtigung vom Sperrbildschirm fern.</string>
53+
<string name="experimental">EXPERIMENTELL</string>
54+
<string name="lock_pill_switch">Wert und Pfeil auf dem Sperrbildschirm zeigen</string>
55+
<string name="lock_pill_turn_on">Jetzt hier \"Sugarglass-Pille auf dem Sperrbildschirm\" einschalten</string>
5456
</resources>

‎app/src/main/res/values-es/strings.xml‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,9 @@
4848
<string name="example">Ejemplo</string>
4949
<string name="lock_pill">Píldora de Sugarglass en la pantalla de bloqueo</string>
5050
<string name="lock_pill_description">Muestra el último valor y la flecha en la parte inferior de la pantalla de bloqueo. Solo dibuja: no lee la pantalla ni pulsa nada.</string>
51-
<string name="lock_pill_title">Píldora en la pantalla de bloqueo (experimental)</string>
52-
<string name="lock_pill_note">Muestra el valor y la flecha abajo en la pantalla de bloqueo y quita de ahí la notificación. Activa \"Píldora de Sugarglass en la pantalla de bloqueo\" en Accesibilidad (en algunos móviles en Aplicaciones descargadas). Si aparece en gris, primero permite los ajustes restringidos desde el menú de Información de la app. Solo dibuja: no lee la pantalla.</string>
53-
<string name="lock_pill_open">Abrir ajustes de accesibilidad</string>
51+
<string name="lock_pill_title">Píldora en la pantalla de bloqueo</string>
52+
<string name="lock_pill_note">Android no deja que ninguna app dibuje en la pantalla de bloqueo, así que la píldora funciona como servicio de accesibilidad: la primera vez activa \"Píldora de Sugarglass en la pantalla de bloqueo\" en Accesibilidad (en algunos móviles en Aplicaciones descargadas). Si aparece en gris, primero permite los ajustes restringidos desde el menú de Información de la app. Solo dibuja: no lee la pantalla. Mientras se muestra, la notificación no aparece en la pantalla de bloqueo.</string>
53+
<string name="experimental">EXPERIMENTAL</string>
54+
<string name="lock_pill_switch">Mostrar valor y flecha en la pantalla de bloqueo</string>
55+
<string name="lock_pill_turn_on">Ahora activa aquí \"Píldora de Sugarglass en la pantalla de bloqueo\"</string>
5456
</resources>

‎app/src/main/res/values-fr/strings.xml‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,9 @@
4848
<string name="example">Exemple</string>
4949
<string name="lock_pill">Pastille Sugarglass sur l\'écran de verrouillage</string>
5050
<string name="lock_pill_description">Affiche la dernière valeur et la flèche en bas de l\'écran de verrouillage. Elle ne fait que dessiner : elle ne lit pas l\'écran et n\'appuie sur rien.</string>
51-
<string name="lock_pill_title">Pastille sur l\'écran de verrouillage (expérimental)</string>
52-
<string name="lock_pill_note">Affiche la valeur et la flèche en bas de l\'écran de verrouillage, et en retire la notification. Activez « Pastille Sugarglass sur l\'écran de verrouillage » dans Accessibilité (parfois sous Applications téléchargées). Si c\'est grisé, autorisez d\'abord les paramètres restreints depuis le menu Infos sur l\'appli. Elle ne fait que dessiner : elle ne lit pas l\'écran.</string>
53-
<string name="lock_pill_open">Ouvrir les paramètres d\'accessibilité</string>
51+
<string name="lock_pill_title">Pastille sur l\'écran de verrouillage</string>
52+
<string name="lock_pill_note">Android ne laisse aucune app dessiner sur l\'écran de verrouillage, la pastille passe donc par un service d\'accessibilité : la première fois, activez « Pastille Sugarglass sur l\'écran de verrouillage » dans Accessibilité (parfois sous Applications téléchargées). Si c\'est grisé, autorisez d\'abord les paramètres restreints depuis le menu Infos sur l\'appli. Elle ne fait que dessiner : elle ne lit pas l\'écran. Tant qu\'elle s\'affiche, la notification reste hors de l\'écran de verrouillage.</string>
53+
<string name="experimental">EXPÉRIMENTAL</string>
54+
<string name="lock_pill_switch">Afficher valeur et flèche sur l\'écran de verrouillage</string>
55+
<string name="lock_pill_turn_on">Activez maintenant ici « Pastille Sugarglass sur l\'écran de verrouillage »</string>
5456
</resources>

‎app/src/main/res/values-it/strings.xml‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,9 @@
4848
<string name="example">Esempio</string>
4949
<string name="lock_pill">Pillola Sugarglass sulla schermata di blocco</string>
5050
<string name="lock_pill_description">Mostra l\'ultimo valore e la freccia in basso sulla schermata di blocco. Disegna e basta: non legge cosa c\'è sullo schermo e non preme nulla.</string>
51-
<string name="lock_pill_title">Pillola sulla schermata di blocco (sperimentale)</string>
52-
<string name="lock_pill_note">Mostra valore e freccia in basso sulla schermata di blocco, e toglie da lì la notifica. Attiva \"Pillola Sugarglass sulla schermata di blocco\" in Accessibilità (su alcuni telefoni sotto App scaricate). Se è grigia, prima consenti le impostazioni con restrizioni dal menu di Info app. Disegna e basta: non legge lo schermo.</string>
53-
<string name="lock_pill_open">Apri impostazioni di accessibilità</string>
51+
<string name="lock_pill_title">Pillola sulla schermata di blocco</string>
52+
<string name="lock_pill_note">Android non lascia disegnare nessuna app sulla schermata di blocco, quindi la pillola funziona come servizio di accessibilità: la prima volta attiva \"Pillola Sugarglass sulla schermata di blocco\" in Accessibilità (su alcuni telefoni sotto App scaricate). Se è grigia, prima consenti le impostazioni con restrizioni dal menu di Info app. Disegna e basta: non legge lo schermo. Mentre è visibile, la notifica resta fuori dalla schermata di blocco.</string>
53+
<string name="experimental">SPERIMENTALE</string>
54+
<string name="lock_pill_switch">Mostra valore e freccia sulla schermata di blocco</string>
55+
<string name="lock_pill_turn_on">Ora attiva qui \"Pillola Sugarglass sulla schermata di blocco\"</string>
5456
</resources>

‎app/src/main/res/values-nl/strings.xml‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,9 @@
4848
<string name="example">Voorbeeld</string>
4949
<string name="lock_pill">Sugarglass-pil op het vergrendelscherm</string>
5050
<string name="lock_pill_description">Toont de laatste waarde en pijl onderaan het vergrendelscherm. Hij tekent alleen: hij leest het scherm niet en drukt nergens op.</string>
51-
<string name="lock_pill_title">Pil op het vergrendelscherm (experimenteel)</string>
52-
<string name="lock_pill_note">Toont waarde en pijl onderaan het vergrendelscherm en haalt de melding daar weg. Zet \"Sugarglass-pil op het vergrendelscherm\" aan bij Toegankelijkheid (soms onder Gedownloade apps). Is het grijs, sta dan eerst beperkte instellingen toe via het menu van App-info. Hij tekent alleen: hij leest het scherm niet.</string>
53-
<string name="lock_pill_open">Toegankelijkheid openen</string>
51+
<string name="lock_pill_title">Pil op het vergrendelscherm</string>
52+
<string name="lock_pill_note">Android laat geen app op het vergrendelscherm tekenen, dus de pil werkt als toegankelijkheidsservice: zet de eerste keer \"Sugarglass-pil op het vergrendelscherm\" aan bij Toegankelijkheid (soms onder Gedownloade apps). Is het grijs, sta dan eerst beperkte instellingen toe via het menu van App-info. Hij tekent alleen: hij leest het scherm niet. Zolang hij zichtbaar is, blijft de melding van het vergrendelscherm af.</string>
53+
<string name="experimental">EXPERIMENTEEL</string>
54+
<string name="lock_pill_switch">Waarde en pijl op het vergrendelscherm tonen</string>
55+
<string name="lock_pill_turn_on">Zet hier nu \"Sugarglass-pil op het vergrendelscherm\" aan</string>
5456
</resources>

‎app/src/main/res/values-pl/strings.xml‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,9 @@
4848
<string name="example">Przykład</string>
4949
<string name="lock_pill">Pigułka Sugarglass na ekranie blokady</string>
5050
<string name="lock_pill_description">Pokazuje ostatnią wartość i strzałkę na dole ekranu blokady. Tylko rysuje: nie czyta ekranu i niczego nie naciska.</string>
51-
<string name="lock_pill_title">Pigułka na ekranie blokady (eksperymentalne)</string>
52-
<string name="lock_pill_note">Pokazuje wartość i strzałkę na dole ekranu blokady i usuwa stamtąd powiadomienie. Włącz \"Pigułka Sugarglass na ekranie blokady\" w Ułatwieniach dostępu (czasem w Pobranych aplikacjach). Jeśli jest wyszarzone, najpierw zezwól na ustawienia z ograniczeniami w menu Informacji o aplikacji. Tylko rysuje: nie czyta ekranu.</string>
53-
<string name="lock_pill_open">Otwórz ułatwienia dostępu</string>
51+
<string name="lock_pill_title">Pigułka na ekranie blokady</string>
52+
<string name="lock_pill_note">Android nie pozwala żadnej aplikacji rysować na ekranie blokady, więc pigułka działa jako usługa ułatwień dostępu: za pierwszym razem włącz \"Pigułka Sugarglass na ekranie blokady\" w Ułatwieniach dostępu (czasem w Pobranych aplikacjach). Jeśli jest wyszarzone, najpierw zezwól na ustawienia z ograniczeniami w menu Informacji o aplikacji. Tylko rysuje: nie czyta ekranu. Gdy jest widoczna, powiadomienie nie pojawia się na ekranie blokady.</string>
53+
<string name="experimental">EKSPERYMENTALNE</string>
54+
<string name="lock_pill_switch">Pokazuj wartość i strzałkę na ekranie blokady</string>
55+
<string name="lock_pill_turn_on">Teraz włącz tutaj \"Pigułka Sugarglass na ekranie blokady\"</string>
5456
</resources>

0 commit comments

Comments
 (0)