[Bug]: Android OS widgets show stale data after idle #975

Description

@piotr-iohk

What happened?

Android OS home-screen widgets can show stale data after the physical device has been idle with the screen off.

On simulator/emulator, while the widget stays visible, OS widget data appears to refresh on schedule. On a physical Android device, after the phone is left idle and then unlocked, the OS widget can still show old data. This seems to affect OS widgets generally, but is easiest to spot on the Blocks widget.

Expected behavior

Android OS widgets should refresh after the configured background interval, or catch up shortly after the device wakes/app becomes active.

Steps to Reproduce

  1. Add a Bitkit Android OS home-screen widget.
  2. Confirm the widget has current data.
  3. Lock the physical Android device and leave it idle with the screen off for around 20 minutes or longer.
  4. Unlock the device and check the OS widget.
  5. Compare against current data. In the same idle test, iOS OS widgets showed updated data while Android still showed the old state.

Logs / Screenshots / Recordings

bitkit_logs_2026-05-29_12-23-10.zip

Bitkit Version

2.2.0

Device / OS

Samsung (Android 14)

Not reproduced on iOS device. Simulator/emulator observation showed scheduled refresh while the widget stayed visible.

Reproducibility

Always

Additional context

Code inspection suggests Android OS widgets and in-app widgets use separate caches and refresh paths:

  • In-app widgets refresh through app-side widget repository jobs.
  • Android OS widgets read cached data from the app widget DataStore and rely on a periodic WorkManager refresh.
  • OS widget XML uses no platform update period fallback.
  • When the device is idle, Android may defer periodic work, and there does not appear to be a foreground/unlock catch-up refresh for OS widget cache.

Likely fix direction: trigger a one-shot OS widget refresh when the app foregrounds or when active OS widgets exist, and/or sync fresh in-app widget data into the OS widget cache.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

Projects

No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

    , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
     blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
    }
    } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
    })();
    (function(){
    try {
    var __m = "github.com";
    var __re = new RegExp('^' + "github\\.com" + '
    
    Skip to content

    [Bug]: Android OS widgets show stale data after idle #975

    Description

    @piotr-iohk

    What happened?

    Android OS home-screen widgets can show stale data after the physical device has been idle with the screen off.

    On simulator/emulator, while the widget stays visible, OS widget data appears to refresh on schedule. On a physical Android device, after the phone is left idle and then unlocked, the OS widget can still show old data. This seems to affect OS widgets generally, but is easiest to spot on the Blocks widget.

    Expected behavior

    Android OS widgets should refresh after the configured background interval, or catch up shortly after the device wakes/app becomes active.

    Steps to Reproduce

    1. Add a Bitkit Android OS home-screen widget.
    2. Confirm the widget has current data.
    3. Lock the physical Android device and leave it idle with the screen off for around 20 minutes or longer.
    4. Unlock the device and check the OS widget.
    5. Compare against current data. In the same idle test, iOS OS widgets showed updated data while Android still showed the old state.

    Logs / Screenshots / Recordings

    bitkit_logs_2026-05-29_12-23-10.zip

    Bitkit Version

    2.2.0

    Device / OS

    Samsung (Android 14)

    Not reproduced on iOS device. Simulator/emulator observation showed scheduled refresh while the widget stayed visible.

    Reproducibility

    Always

    Additional context

    Code inspection suggests Android OS widgets and in-app widgets use separate caches and refresh paths:

    • In-app widgets refresh through app-side widget repository jobs.
    • Android OS widgets read cached data from the app widget DataStore and rely on a periodic WorkManager refresh.
    • OS widget XML uses no platform update period fallback.
    • When the device is idle, Android may defer periodic work, and there does not appear to be a foreground/unlock catch-up refresh for OS widget cache.

    Likely fix direction: trigger a one-shot OS widget refresh when the app foregrounds or when active OS widgets exist, and/or sync fresh in-app widget data into the OS widget cache.

    Activity

    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

    Metadata

    Metadata

    Assignees

    Labels

    No labels
    No labels

    Type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
      Skip to content

      [Bug]: Android OS widgets show stale data after idle #975

      Description

      @piotr-iohk

      What happened?

      Android OS home-screen widgets can show stale data after the physical device has been idle with the screen off.

      On simulator/emulator, while the widget stays visible, OS widget data appears to refresh on schedule. On a physical Android device, after the phone is left idle and then unlocked, the OS widget can still show old data. This seems to affect OS widgets generally, but is easiest to spot on the Blocks widget.

      Expected behavior

      Android OS widgets should refresh after the configured background interval, or catch up shortly after the device wakes/app becomes active.

      Steps to Reproduce

      1. Add a Bitkit Android OS home-screen widget.
      2. Confirm the widget has current data.
      3. Lock the physical Android device and leave it idle with the screen off for around 20 minutes or longer.
      4. Unlock the device and check the OS widget.
      5. Compare against current data. In the same idle test, iOS OS widgets showed updated data while Android still showed the old state.

      Logs / Screenshots / Recordings

      bitkit_logs_2026-05-29_12-23-10.zip

      Bitkit Version

      2.2.0

      Device / OS

      Samsung (Android 14)

      Not reproduced on iOS device. Simulator/emulator observation showed scheduled refresh while the widget stayed visible.

      Reproducibility

      Always

      Additional context

      Code inspection suggests Android OS widgets and in-app widgets use separate caches and refresh paths:

      • In-app widgets refresh through app-side widget repository jobs.
      • Android OS widgets read cached data from the app widget DataStore and rely on a periodic WorkManager refresh.
      • OS widget XML uses no platform update period fallback.
      • When the device is idle, Android may defer periodic work, and there does not appear to be a foreground/unlock catch-up refresh for OS widget cache.

      Likely fix direction: trigger a one-shot OS widget refresh when the app foregrounds or when active OS widgets exist, and/or sync fresh in-app widget data into the OS widget cache.

      Activity

      Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

      Metadata

      Metadata

      Assignees

      Labels

      No labels
      No labels

      Type

      Projects

      No projects

        Milestone

        Relationships

        None yet

        Development

        No branches or pull requests

        Issue actions

        , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
        Skip to content

        [Bug]: Android OS widgets show stale data after idle #975

        Description

        @piotr-iohk

        What happened?

        Android OS home-screen widgets can show stale data after the physical device has been idle with the screen off.

        On simulator/emulator, while the widget stays visible, OS widget data appears to refresh on schedule. On a physical Android device, after the phone is left idle and then unlocked, the OS widget can still show old data. This seems to affect OS widgets generally, but is easiest to spot on the Blocks widget.

        Expected behavior

        Android OS widgets should refresh after the configured background interval, or catch up shortly after the device wakes/app becomes active.

        Steps to Reproduce

        1. Add a Bitkit Android OS home-screen widget.
        2. Confirm the widget has current data.
        3. Lock the physical Android device and leave it idle with the screen off for around 20 minutes or longer.
        4. Unlock the device and check the OS widget.
        5. Compare against current data. In the same idle test, iOS OS widgets showed updated data while Android still showed the old state.

        Logs / Screenshots / Recordings

        bitkit_logs_2026-05-29_12-23-10.zip

        Bitkit Version

        2.2.0

        Device / OS

        Samsung (Android 14)

        Not reproduced on iOS device. Simulator/emulator observation showed scheduled refresh while the widget stayed visible.

        Reproducibility

        Always

        Additional context

        Code inspection suggests Android OS widgets and in-app widgets use separate caches and refresh paths:

        • In-app widgets refresh through app-side widget repository jobs.
        • Android OS widgets read cached data from the app widget DataStore and rely on a periodic WorkManager refresh.
        • OS widget XML uses no platform update period fallback.
        • When the device is idle, Android may defer periodic work, and there does not appear to be a foreground/unlock catch-up refresh for OS widget cache.

        Likely fix direction: trigger a one-shot OS widget refresh when the app foregrounds or when active OS widgets exist, and/or sync fresh in-app widget data into the OS widget cache.

        Activity

        Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

        Metadata

        Metadata

        Assignees

        Labels

        No labels
        No labels

        Type

        Projects

        No projects

          Milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
          Skip to content

          [Bug]: Android OS widgets show stale data after idle #975

          Description

          @piotr-iohk

          What happened?

          Android OS home-screen widgets can show stale data after the physical device has been idle with the screen off.

          On simulator/emulator, while the widget stays visible, OS widget data appears to refresh on schedule. On a physical Android device, after the phone is left idle and then unlocked, the OS widget can still show old data. This seems to affect OS widgets generally, but is easiest to spot on the Blocks widget.

          Expected behavior

          Android OS widgets should refresh after the configured background interval, or catch up shortly after the device wakes/app becomes active.

          Steps to Reproduce

          1. Add a Bitkit Android OS home-screen widget.
          2. Confirm the widget has current data.
          3. Lock the physical Android device and leave it idle with the screen off for around 20 minutes or longer.
          4. Unlock the device and check the OS widget.
          5. Compare against current data. In the same idle test, iOS OS widgets showed updated data while Android still showed the old state.

          Logs / Screenshots / Recordings

          bitkit_logs_2026-05-29_12-23-10.zip

          Bitkit Version

          2.2.0

          Device / OS

          Samsung (Android 14)

          Not reproduced on iOS device. Simulator/emulator observation showed scheduled refresh while the widget stayed visible.

          Reproducibility

          Always

          Additional context

          Code inspection suggests Android OS widgets and in-app widgets use separate caches and refresh paths:

          • In-app widgets refresh through app-side widget repository jobs.
          • Android OS widgets read cached data from the app widget DataStore and rely on a periodic WorkManager refresh.
          • OS widget XML uses no platform update period fallback.
          • When the device is idle, Android may defer periodic work, and there does not appear to be a foreground/unlock catch-up refresh for OS widget cache.

          Likely fix direction: trigger a one-shot OS widget refresh when the app foregrounds or when active OS widgets exist, and/or sync fresh in-app widget data into the OS widget cache.

          Activity

          Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

          Metadata

          Metadata

          Assignees

          Labels

          No labels
          No labels

          Type

          Projects

          No projects

            Milestone

            Relationships

            None yet

            Development

            No branches or pull requests

            Issue actions

            , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
            Skip to content

            [Bug]: Android OS widgets show stale data after idle #975

            Description

            @piotr-iohk

            What happened?

            Android OS home-screen widgets can show stale data after the physical device has been idle with the screen off.

            On simulator/emulator, while the widget stays visible, OS widget data appears to refresh on schedule. On a physical Android device, after the phone is left idle and then unlocked, the OS widget can still show old data. This seems to affect OS widgets generally, but is easiest to spot on the Blocks widget.

            Expected behavior

            Android OS widgets should refresh after the configured background interval, or catch up shortly after the device wakes/app becomes active.

            Steps to Reproduce

            1. Add a Bitkit Android OS home-screen widget.
            2. Confirm the widget has current data.
            3. Lock the physical Android device and leave it idle with the screen off for around 20 minutes or longer.
            4. Unlock the device and check the OS widget.
            5. Compare against current data. In the same idle test, iOS OS widgets showed updated data while Android still showed the old state.

            Logs / Screenshots / Recordings

            bitkit_logs_2026-05-29_12-23-10.zip

            Bitkit Version

            2.2.0

            Device / OS

            Samsung (Android 14)

            Not reproduced on iOS device. Simulator/emulator observation showed scheduled refresh while the widget stayed visible.

            Reproducibility

            Always

            Additional context

            Code inspection suggests Android OS widgets and in-app widgets use separate caches and refresh paths:

            • In-app widgets refresh through app-side widget repository jobs.
            • Android OS widgets read cached data from the app widget DataStore and rely on a periodic WorkManager refresh.
            • OS widget XML uses no platform update period fallback.
            • When the device is idle, Android may defer periodic work, and there does not appear to be a foreground/unlock catch-up refresh for OS widget cache.

            Likely fix direction: trigger a one-shot OS widget refresh when the app foregrounds or when active OS widgets exist, and/or sync fresh in-app widget data into the OS widget cache.

            Activity

            Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

            Metadata

            Metadata

            Assignees

            Labels

            No labels
            No labels

            Type

            Projects

            No projects

              Milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
              Skip to content

              [Bug]: Android OS widgets show stale data after idle #975

              Description

              @piotr-iohk

              What happened?

              Android OS home-screen widgets can show stale data after the physical device has been idle with the screen off.

              On simulator/emulator, while the widget stays visible, OS widget data appears to refresh on schedule. On a physical Android device, after the phone is left idle and then unlocked, the OS widget can still show old data. This seems to affect OS widgets generally, but is easiest to spot on the Blocks widget.

              Expected behavior

              Android OS widgets should refresh after the configured background interval, or catch up shortly after the device wakes/app becomes active.

              Steps to Reproduce

              1. Add a Bitkit Android OS home-screen widget.
              2. Confirm the widget has current data.
              3. Lock the physical Android device and leave it idle with the screen off for around 20 minutes or longer.
              4. Unlock the device and check the OS widget.
              5. Compare against current data. In the same idle test, iOS OS widgets showed updated data while Android still showed the old state.

              Logs / Screenshots / Recordings

              bitkit_logs_2026-05-29_12-23-10.zip

              Bitkit Version

              2.2.0

              Device / OS

              Samsung (Android 14)

              Not reproduced on iOS device. Simulator/emulator observation showed scheduled refresh while the widget stayed visible.

              Reproducibility

              Always

              Additional context

              Code inspection suggests Android OS widgets and in-app widgets use separate caches and refresh paths:

              • In-app widgets refresh through app-side widget repository jobs.
              • Android OS widgets read cached data from the app widget DataStore and rely on a periodic WorkManager refresh.
              • OS widget XML uses no platform update period fallback.
              • When the device is idle, Android may defer periodic work, and there does not appear to be a foreground/unlock catch-up refresh for OS widget cache.

              Likely fix direction: trigger a one-shot OS widget refresh when the app foregrounds or when active OS widgets exist, and/or sync fresh in-app widget data into the OS widget cache.

              Activity

              Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

              Metadata

              Metadata

              Assignees

              Labels

              No labels
              No labels

              Type

              Projects

              No projects

                Milestone

                Relationships

                None yet

                Development

                No branches or pull requests

                Issue actions

                , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
                Skip to content

                [Bug]: Android OS widgets show stale data after idle #975

                Description

                @piotr-iohk

                What happened?

                Android OS home-screen widgets can show stale data after the physical device has been idle with the screen off.

                On simulator/emulator, while the widget stays visible, OS widget data appears to refresh on schedule. On a physical Android device, after the phone is left idle and then unlocked, the OS widget can still show old data. This seems to affect OS widgets generally, but is easiest to spot on the Blocks widget.

                Expected behavior

                Android OS widgets should refresh after the configured background interval, or catch up shortly after the device wakes/app becomes active.

                Steps to Reproduce

                1. Add a Bitkit Android OS home-screen widget.
                2. Confirm the widget has current data.
                3. Lock the physical Android device and leave it idle with the screen off for around 20 minutes or longer.
                4. Unlock the device and check the OS widget.
                5. Compare against current data. In the same idle test, iOS OS widgets showed updated data while Android still showed the old state.

                Logs / Screenshots / Recordings

                bitkit_logs_2026-05-29_12-23-10.zip

                Bitkit Version

                2.2.0

                Device / OS

                Samsung (Android 14)

                Not reproduced on iOS device. Simulator/emulator observation showed scheduled refresh while the widget stayed visible.

                Reproducibility

                Always

                Additional context

                Code inspection suggests Android OS widgets and in-app widgets use separate caches and refresh paths:

                • In-app widgets refresh through app-side widget repository jobs.
                • Android OS widgets read cached data from the app widget DataStore and rely on a periodic WorkManager refresh.
                • OS widget XML uses no platform update period fallback.
                • When the device is idle, Android may defer periodic work, and there does not appear to be a foreground/unlock catch-up refresh for OS widget cache.

                Likely fix direction: trigger a one-shot OS widget refresh when the app foregrounds or when active OS widgets exist, and/or sync fresh in-app widget data into the OS widget cache.

                Activity

                Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

                Metadata

                Metadata

                Assignees

                Labels

                No labels
                No labels

                Type

                Projects

                No projects

                  Milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions