Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feature: Live Activity #2191

Open
wants to merge 38 commits into
base: dev
Choose a base branch
from
Open

Conversation

bastiaanv
Copy link

@bastiaanv bastiaanv commented Jul 15, 2024

This PR is an initial/basic version of this Live Activity, without any feature which are spoken of in the Zulipchat.

Look & Feel:

Lock Screen (all iPhone's):

History only History and predictive line Live activity stale (8h limit i.e.)
IMG_2536 IMG_2534 IMG_2535

Dynamic Island (iPhone 14 pro max and higher):

Screenshots are from a iPhone 15 pro max simulator

Dynamic Island minimal Dynamic Island expanded
Simulator Screenshot - iPhone 15 Pro Max - 2024-07-15 at 12 49 36 Simulator Screenshot - iPhone 15 Pro Max - 2024-07-15 at 12 51 14

Settings

Can be found at: Settings -> Alert management -> Live Activity

Root settings Bottom row settings Available datapoints for bottom row
IMG_2537 IMG_2538 IMG_2539

Things to know:

  • The bottom row has a max of 4 items, but less items can be configured for small screen sizes (like the iPhone 13 mini)
  • The bottom row can be configured to the user's wishes. Swap items around, different order etc. The default is: CurrentBG, IOB, COB, UpdatedAt (like in the screenshots)
  • The following events trigger a re-render of the Live Activity:
    • LoopDataManager -> GlucoseStore.glucoseSamplesDidChange
    • LoopDataManager -> CarbStore.carbEntriesDidChange
    • LoopDataManager -> dosing changing
    • NotificationCenter -> UIApplication.willEnterForegroundNotification

@A9qx
Copy link

A9qx commented Jul 16, 2024

Love the draft/prototype! Would love to see this make it into the project down the line I think it looks amazing!

@marionbarker
Copy link
Contributor

Built onto my real phone. Thanks so much for making this available. 👍

@bastienmoulia
Copy link

bastienmoulia commented Jul 24, 2024

Awesome work !

Feat request

  • Is it possible to change the y-axis of the graph in order to be more center on the data like in the app?
    image
    image

  • Maybe the blue area can replace the settings of the upper / lower limit, because it can change in the day. Or maybe the blue area should be displayed with no limit like the other graphs

  • In order to have the graph with full width, the status ring could be in the bottom bar

Bugs found

  • Sometime on iPhone 13 Pro the live activity don't appear. I have to Disable and Enable it in the settings to have it again.

@marionbarker
Copy link
Contributor

I have been using this for several days - I really enjoy having it attached to Loop.

Bug report:

  • Dynamic Island expanded (long press on dynamic island)
    • truncates the display when glucose is in mg/dL and above 99 mg/dL
    • graphic below with 24 hour display disabled (top) and enabled (bottom)

loop-pr-2191-dynamic-island-expanded

Feature requests:

  • see the target range shown on the Look Screen Widget graph
  • see if an override is currently enabled, definitely added to target display on graph, possibly with the override name displayed

ebouchut added a commit to ebouchut/LoopWorkspace that referenced this pull request Jul 24, 2024
@bastiaanv
Copy link
Author

bastiaanv commented Jul 25, 2024

Thanks for all the feedback:

  • The truncate bug has been fixed @marionbarker
  • Also I added the blue area (glucose targets) & the preset to the views, so thank you for the ideas @marionbarker @bastienmoulia .
  • @bastienmoulia I have enabled some extra logging for myown device to research the issue regarding the disappearing of the Live Activity.

Preview

Blue area (glucose target) Preset enabled (without predictive line) Preset enabled (with predictive line)
Simulator Screenshot - iPhone 15 - 2024-07-25 at 20 19 57 Simulator Screenshot - iPhone 15 - 2024-07-25 at 20 07 31 Simulator Screenshot - iPhone 15 - 2024-07-25 at 20 20 08

@marionbarker
Copy link
Contributor

marionbarker commented Jul 25, 2024

Nice upgrade except the override appears confused.

  • This override was active from 11:05 to 1:05 pm (with 2 hours duration), but it shows as being currently active (1:45 pm).
  • I see the same pattern when long-pressing the dynamic island.
  • I updated with the latest commit at 1:21 pm local (after this override had expired).

old-override-shows

  • I added a new override at 1:47 pm that has a duration of 3 hours.
  • I will report back in 20 minutes or so. Long enough to see if the start point is correct
  • And then I will turn it off and see what the plots look like.

@marionbarker
Copy link
Contributor

The walking override started at 1:47 with a duration of 3 hours and was cancelled 19 minutes later.

  • upper plot: While override is active. The bad news is the start point for the plot for both lock screen and dynamic island expanded plot is "now" instead of when override started.
  • lower plot: After disabling the override. The good news is that plotting a cancelled override was not repeated - perhaps that was related to the new build, or perhaps because it was cancelled instead of allowed to run the full duration.

override-status

@bastienmoulia
Copy link

Thanks for the blue area!

Same here for the bug with an override label shown even none were triggered
IMG_B15E4FD11EDD-1

@marionbarker
Copy link
Contributor

I did a bit more testing.

  • If an override is active, it is shown as starting "now"
  • If an override expires after the planned duration, it continues to be show starting "now"
  • If an override is cancelled early, no extraneous override is displayed

@bastienmoulia
Copy link

In the last update, I didn't see the target area for the next hour by default:
IMG_598D1AB784AD-1

If I activate the premeal, then remove it, it's ok.

@partcoffee
Copy link

Bug report

When using Nightscout as CGM, it appears that the data will always be reported as stale. For additional context on this issue, Nightscout is reading from LibreLinkUp, and thus reporting blood glucose values on a 1-minute interval, which may affect how this is handled.

Using v3.4.1 with the latest customization as of today.

@bastiaanv
Copy link
Author

Hi @partcoffee ,

This behaviour is correct. The Live Activity doesnt keep iOS from suspending the app (also called Heartbeath). This also means that Loop isn't doing anything while the app is suspended. Jumping to conclusion, I assume you use Loop as a following app (just watching the BG values from NightScout).

There are a few ways to correct this:

  1. Connect a BLE-enabled pump to Loop
  2. Customize Loop to include background sounds (like LoopFollow) or use Location services to keep Loop from being suspended
  3. Or switch to something like xDrip4ios which is a dedicated app to follow BG values from different sources like NightScout or LibreLinkUp

@partcoffee
Copy link

Hi @partcoffee ,

This behaviour is correct. The Live Activity doesnt keep iOS from suspending the app (also called Heartbeath). This also means that Loop isn't doing anything while the app is suspended. Jumping to conclusion, I assume you use Loop as a following app (just watching the BG values from NightScout).

There are a few ways to correct this:

  1. Connect a BLE-enabled pump to Loop

  2. Customize Loop to include background sounds (like LoopFollow) or use Location services to keep Loop from being suspended

  3. Or switch to something like xDrip4ios which is a dedicated app to follow BG values from different sources like NightScout or LibreLinkUp

Thanks for the clarification, but I'm using Nightscout as a CGM with Omnipod Dash, which functions as a heartbeat as well from my understanding. Loop is running its normal closed loop activities in the background like bolusing and suspending basal based on the readings from Nightscout.

My CGM is not compatible unfortunately, which is why Nightscout is being used.

The Live Activity is reporting the data as stale immediately, and not after a few minutes, when the app in theory still would be "awake".

@bastiaanv
Copy link
Author

@partcoffee My bad. Thank you for the clarification!

I think you are spot on with the 1 minute time interval. The LA has a limit for the amount of data I can send to the widget, too much data leads to the Widget always being stale. So I can limit the amount of samples being send to the widget even further, but that would limit the usages of the LA. You could try to limit the glucoseSamples yourself for the LA maybe to 70: https://github.com/bastiaanv/Loop/blob/feat/live-activity/Loop/Managers/Live%20Activity/GlucoseActivityManager.swift#L183

But the best solution would be to limit the amount of Glucose samples in Nightscout. Maybe the import script you are running allows for something like that?

@bastiaanv
Copy link
Author

@marionbarker I fixed your reported bugs! I also made that when you open Loop and the LA isn't showing but is activated, that Loop will recreate the LA, without the need to re-enable LA or kill Loop

@partcoffee
Copy link

@bastiaanv Thanks for looking in to it! I'll do some tinkering with it myself, I know it's a very niche issue.

I think the best approach would be to alter Nightscout, as you suggested. Loop runs a lot better with 5 minute intervals.

@bastiaanv
Copy link
Author

Good luck! If you need help, you can always contact me via DM on Zulipchat

@bastiaanv
Copy link
Author

@marionbarker Update the PR to include a save button and minor bg coloring fix

@marionbarker
Copy link
Contributor

Not published yet in CustomizationSelect.
Testing prior to publishing.

Test result 1

The stale override that expired at end of duration is fixed.

Save is almost ok

The save button is there but does not seem to work quite right.

  1. If I go to the Live Activities screen
    • make a modification
    • save it and then use the Back button and then return to the Live Activities screen - it shows previous value (before I hit save)
  2. If I subsequently view the LA widget on the Lock Screen, the widget does show the update
  3. If I then go back to the Live Activities display, the modifications shows as a requested in Step 1

I rebooted the phone and got the same behavior.

@rfmurphy81
Copy link

rfmurphy81 commented Sep 8, 2024

@bastiaanv, thanks so much for putting this together. I put this together last night and had a few notes that I was hoping to pass along for you to consider incorporating into the next commit:

  1. On the lock screen, the deault lime green color of the current glucose reading is difficult to read on my light blue background during the daytime (using the "weather" background). See attached. The contrast needs to be sharper. If it were black or a darker color, it would be easier to read. I see you can remove the BG colors via the Settings, but I think the default "normal" color should be black instead of lime green.
    IMG_0482
  2. On the lock screen, is it possible to update the grid so it doesn't show areas out of range? In the screenshot above, I am put expected to go in the lower range (the previous low value was 86) so it would make sense to show the grid range as 75-175 like it does within the Loop app itself. Hopefully that makes sense.
  3. In the Settings > Notifications > Live activity screen, the Save button seems to save my changes but doesn't close the window. Unsure why this is happening.

I built this last night with the code. This feature is so awesome. I'm already finding it much more convenient to keep ann eye on things than before. :)

And for those who are not as technically savvy as me, I followed the instructions at https://www.loopandlearn.org/custom-code/ which easily allowed me to pull in a set list of customizations, including this one. :)

@bastiaanv
Copy link
Author

@rfmurphy81 First of all, thank you for your feedback! Really appreciate it.

I will try to find some time to fix the save button soon!

About point 1: The only option currently is to disable BG colouring, but since the save button doesnt work correctly it is hard to try that option. Other idea: would less opacity in the background be a solution for you? Because I think changing the color would be a solution for your background color, but not for someone else. Having less opacity in the widget would leave the widget less vulnerable to this issue.

About point 2: I found the code for the y-axis calculation for the Loop chart, will use that code as soon as I try to fix the save button!

@bastiaanv
Copy link
Author

@marionbarker I updated the LA with the following:

  • Fix for the Save button
  • Removed the auto-scaling and ported the Loop yAxis generator

Do you have time for a update of the customisation?

@marionbarker
Copy link
Contributor

The most recent updates to Live Activity have been incorporated in the customization script. Run the script again and you will be offered an update to Live Activity if you already have it installed.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/loopandlearn/lnl-scripts/main/CustomizationSelect.sh)"

Documentation overview for the script: https://www.loopandlearn.org/custom-code/#overview

@cachrisman
Copy link

cachrisman commented Sep 17, 2024

Just wanted to share something I just noticed - that with the live activity running, if my phone is in StandBy (mine is on a MagSafe desk charger), it shows my BG as a small bubble in the upper right of the clock and I can tap that and see the live activity full screen. Pretty neat!!

Keep up the good work everyone! Thank you for all you do!

IMG_0108
IMG_0109

@bastiaanv bastiaanv changed the title [DRAFT] feature: Live Activity feature: Live Activity Sep 19, 2024
@bastiaanv
Copy link
Author

Progress update:

Allow users to always show the LA or to show the live activity on specific triggers (for now: High or low prediction)

Settings Live Activity trigger warning
IMG_0031 IMG_0030

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants