v10.06: Galaxy Watch 4 system fixes (AOD shift + calendar)

Please share:


Staged rollout, to receive update quicker: become a beta tester

  • Galaxy Watch 4 always-on-display shift to avoid screen burn in (see details below)
  • Workaround for broken Galaxy Watch 4 calendar complication

beta 1:

  • Option to control Galaxy Watch 4 AOD shift radius, set to ‘0’ to disable (default=5)
  • Optimized shift redraw
  • GW4 calendar complication not updated if no change (caused vibration every 20 minutes)

Screen burn-in protection

Believe it or not, Samsung omitted screen burn in protection from the Galaxy Watch 4. Owners of this watch are experiencing screen burn-in after half a year of use. Bubble Cloud takes various measures and offers a number extra options to prevent OLED display burn in. For more information see the post on Burn In Protection.

Standard Wear OS automatically shifts ambient watch face by a 9 pixels (4 pixels in all directions) – see the left animation on a Huawei Watch 1 running Wear OS 2.0:

Since Galaxy Watch 4 doesn’t do this at the system level, version 10.06 of Bubble Cloud now implements this – see the second animation on the right, showing my Galaxy Watch 4:

  • the low-power screen is shifted around a circle of 4 pixel radius
  • Bubble Cloud gently shifts burn-in offsets, minimizing the change for the user
  • the always on screen was filmed over a span of an hour and sped up make this movement observable
  • in my implementation the rotation is not reset after waking up the watch (continuing the rotation further equalizes the pixel load)
  • status icons (on the top of the watch face) stay in place, since these are overlaid by the system the watch face doesn’t have control over them

To preserve your screen, I highly recommend using Bubble Cloud as your watch face on the Galaxy Watch 4.


There are many ways to achieve this, I simply added a canvas.translate command on the top of the onDraw method:

  • I keep track of a “desired shift” vector (dsX,dsY) and an “actual shift” (asX, asY). I also keep track of the progress around the circular trail (p)
  • The “actual shift” is reset to zero every time the watch wakes from ambient mode, for the least amount of perceivable change we will return to our previous desired shift position pixel by pixel every minute after we enter ambient mode i.e. if(dsX<asX) asX– else if(dsX>asX) asX++
  • After we reach our desired shift state, we continue to go around. For this I used a vector array (dir)  {1,1,1,0,-1,-1,-1,0} adding dirp to dsX and dirp+6 to dsY,
    i.e. dsX+=dir[p%8]; dsY+=dir[(p+6)%8]
  • increasing p when the shift distance would become greater than the radius
    i.e. dsX2+dsY2>radius2 or dsX*dsX+dsY*dsY>RxR

This method approximates a circular path without the use of trigonometric functions or more complex calculations in onDraw. Keeping track of a desired shift and actual shift makes sure we don’t restart every time the watch face wakes, and wander around the whole shift area with about the same probability, making sure to equalize pixel load.

You should also clear along the edges, since the canvas might come with a previous state of the watch face. I found canvas.drawColor to be way too slow, and unnecessary to fill the whole watch face, so I added logic to fill the uncovered edges only with black pixels:
ie. if(asX<0) canvas.drawRect(bounds.right+asX,bounds.top,bounds.right,bounds.bottom, blackPaint) etc.

I hope these help with the implementation, I can provide Kotlin or Java code if someone needs it.

Samsung calendar complication

Yes, Samsung broke the calendar long text complication too. Since their system update in February, the calendar complication fails to show any information on 3rd party watch faces.

Bubble Cloud now has the workaround, you can still use the Calendar complication in the upper or lower text fields, and / or in the peek card (even together with the dual peek card for notifications!)

Background: it wasn’t easy:

  • Bubble Cloud now intercepts complication updates and identifies if you have added the calendar complication on a Samsung watch.
  • Then, it will query the Calendar content provider directly and show your next appointment.
  • These complications fail to update too, so Bubble Cloud has to check for calendar changes every 20 minutes and at the beginning of the event, to be able to query the next. This happens during the regular update cycles, so it shouldn’t cause increased battery drain.
  • But, since the refresh window is 20 minutes, last minute additions to your calendar might/will not appear immediately on your watch face (unless you tap on the peek card or text field, which triggers an immediate refresh).

See also

Burn In Protection?

v10.1.0: Workaround for new Galaxy Watch 4 AOD bug

Bring back wrist gestures, AOD shift on Wear 3.5 (Pixel Watch + Fossil gen6!)

Author: greg

the dev