Is there a list of devices that support onPartialUpdate?

I am poking around onPartialUpdate in a test watchface project. I am going watch model by model in the simulator and I am yet to find one that supports it (though I am checking AMOLED devices only). The code is:

  var yes = (Toybox.WatchUi.WatchFace has :onPartialUpdate);
System.println(yes ? "Has it" : "Doesn't have it");

Building with the SDK 7.2.1.

I've gotta be missing something obvious here... is that that it's not supported on AMOLED watches?

  • Soooo, it looks like Apple has implemented once-per-second updates for watchfaces in when idle / in “standby mode” (equivalent to Garmin’s low-power mode) for the new Apple Watch Series 10. 

    I wonder if Garmin will feel compelled to keep up.

    https://www.dcrainmaker.com/2024/09/apple-watch-series-10-hands-on-details.html

    Always-on display mode will now show seconds even when wrist is down (updates at 1-second rate in standby mode, versus 1-minute rate)

    https://arstechnica.com/gadgets/2024/09/apple-watch-series-10-is-smaller-thinner-lighter-and-has-some-intelligence/

    Apple's first wide-angle OLED display inside the Series 10 is 40 percent brighter than the Series 9. It allows for a wider variety of viewing angles. Its refresh rate, when idle, can update information from apps and complications once a second instead of the existing once-a-minute rate.

    I wonder if the implication here is that the new OLED display is able to refresh once per second while still using an acceptably low amount of energy.

    (No I didn’t watch the official Apple event.)

  • What is the danger of assuming partial updates on all watches?  I have an Epix Pro 2 and have hardwired it to allow partial updates and the second hand works perfectly, yet, (Toybox.WatchUi.WatchFace has :onPartialUpdate) returns false so I ignore it.  I also have an old Venu, which also displays the second hand, so both which are not meant to support 1Hz refresh work fine.

  • Unless your HR is relatively stable, thus the tens digit almost doesn't change, or even worse if your HR is above 100, in which case the 1 will always burn in unless you also move it on the screen (but moving just a few pixels probably will still have some common pixels between the different positions...)

  • The danger is that it won't work as you think

  • But partial updates is called until lower power mode is executed, after that the display will go off if always on is not enabled. If partial updates is off, then the second hand simply doesn’t run and again the display will go off if always on is off. If always on is on then either way the display stays on whether partial updates is on or off. I don’t see the dependency of partial updates on burn in. I do see it if the user leaves always on and in the background the pixels are not moving around but that hasn’t anything to do with partial update. Unless I’m missing something (which is entirely possible)?

  • I replied to someone else. Not sure what's going on with the forum though... I saw that comment that I replied to as a new one from today, but after I replied I saw it's from 8 months ago...

  • What is the danger of assuming partial updates on all watches?  I have an Epix Pro 2 and have hardwired it to allow partial updates and the second hand works perfectly, yet, (Toybox.WatchUi.WatchFace has :onPartialUpdate) returns false so I ignore it.  I also have an old Venu, which also displays the second hand, so both which are not meant to support 1Hz refresh work fine.

    Not sure what you mean by "hardwired it to allow partial updates".

    If you implement onPartialUpdate(), it simply won't run on AMOLED devices. You could put anything you want in the function, and it wouldn't matter.

    On MIP devices, onPartialUpdate() has to be written in a specific way which requires time and effort (you literally have to partially update the screen), to allow 1 Hz updates all the time (not just in high power mode). The code also takes up space in your app (which leads to increased memory usage)

    That's why people want to know whether onPartialUpdate() is supported:

    - to know if it would actually work on a given device

    - to know whether they could test it on a given device

    - to know if it they should bother implementing it at all

    If you only support AMOLED devices, there is no point in supporting onPartialUpdate().

    But partial updates is called until lower power mode is executed, after that the display will go off if always on is not enabled. If partial updates is off, then the second hand simply doesn’t run and again the display will go off if always on is off. If always on is on then either way the display stays on whether partial updates is on or off. I don’t see the dependency of partial updates on burn in. I do see it if the user leaves always on and in the background the pixels are not moving around but that hasn’t anything to do with partial update. Unless I’m missing something (which is entirely possible)?

    It does seem like you don't understand onPartialUpdate() / partial updates, if you think that "partial updates" are happening on AMOLED devices (they're not). Partial updates only apply to MIP watchfaces.

    It's clear you're talking about AMOLED devices since MIP devices don't turn off the display, and burn in is not an issue for MIP devices.

    Watchfaces for both MIP and AMOLED support "high power mode" and "low power mode".

    High power mode:

    - High power mode is entered when the user turns their wrist to look at the watchface and times out after a few seconds (which returns it to low power mode). During this time, onUpdate() is called once per second, and the app can update the entire screen with no power or burn-in restrictions. This applies to both MIP and AMOLED watches

    Low power mode:

    - Low power mode is the state of the watchface when it's not in high power mode (i.e. the user is not looking at the watch).

    -- For AMOLED watches, if AOD is disabled, the display turns off. If AOD is enabled, the display stays on, but onUpdate() is only called once per minute [and updates are subject to burn in restrictions]

    -- For MIP watches, the display stays on, and onUpdate() is only called once per minute. However, the watchface may still be able to update faster than once per minute:

    --- For MIP watches that do not support onPartialUpdate, the watchface cannot update faster than once per minute

    --- For MIP watches that do support onPartialUpdate, if the watchface implements onPartialUpdate, it updates once per second all the time. onUpdate is called once per minute and onPartialUpdate is called once per second the rest of the time. However, onPartialUpdate can only update part of the screen (subject to a power budget), whereas onUpdate can always update the entire screeen. This means that in low power mode, only a small part of the screen can be constantly updating (such as a seconds indicator or HR complication)

    References:

    https://developer.garmin.com/connect-iq/user-experience-guidelines/watch-faces/ (explains low and high power modes)

    https://developer.garmin.com/connect-iq/connect-iq-faq/how-do-i-get-my-watch-face-to-update-every-second/

    https://developer.garmin.com/connect-iq/connect-iq-faq/how-do-i-make-a-watch-face-for-amoled-products/

    TL;DR onPartialUpdate() only exists to allow supported MIP devices to update CIQ watchface once per second in low power mode. This isn't possible on AMOLED devices, so there's no point in trying to implement onPartialUpdate for those devices

  • off topic:  curious: have you really replied to my comment and then answered to SimonJEdwards' comment or are we seeing a new bug in the forum?

  • I replied to your comment because I originally had a reply to you in my post, but I edited it out because it was kind of irrelevant. Sorry! Nothing wrong with the forum (in this case)