glance-appwidget-updates-and-memory
Manages Android AppWidget state updates, background syncs, and RemoteViews
Install / Use
npx skills add android/skills --skill glance-appwidget-updates-and-memoryInstalls into whichever agent you are using.
SKILL.md
Installable skill definition
Quality Score
Category
Development & EngineeringSupported Platforms
Our assessment of glance-appwidget-updates-and-memory
glance-appwidget-updates-and-memory scores 90/100 on our quality scale, 1292nd of 4,639 Development & Engineering skills we index (top 28%).
Its SKILL.md is 21 KB long, well organised into 11 sections with 1 code example: a thorough specification that gives an agent plenty to work with.
With 7,514 GitHub stars, it is one of the more widely adopted skills in the catalogue.
Maintenance, license and trust
- The repository was last updated 40 days ago, so glance-appwidget-updates-and-memory is actively maintained.
- It is released under the Apache-2.0 license, a permissive license that allows use, modification and commercial use with attribution.
- Its trust signals score 100/100, with no cautions. These come from repository metadata, not a code audit — read the skill file before letting an agent act on it.
Safety scan
No issues foundOur scan of the whole file found no instruction hijacking, hidden characters, credential access, data exfiltration or destructive commands.
Automated pattern scan on 2026-11-02. It catches known dangerous patterns, not every risk — read a skill before letting an agent act on it.
glance-appwidget-updates-and-memory compared with similar skills
All 4 of these similar skills score higher than glance-appwidget-updates-and-memory; compare them before choosing.
| Skill | Score | Stars | Updated | Format |
|---|---|---|---|---|
| glance-appwidget-updates-and-memory (this skill)by android | 90 | 7.5k | 40d ago | SKILL.md |
| taste-skillby Leonxlnx | 100 | 108.3k | 2d ago | CLAUDE.md |
| Agent-Reachby Panniantong | 100 | 107.8k | 1d ago | CLAUDE.md |
| headroomby headroomlabs-ai | 100 | 78.6k | today | CLAUDE.md |
| ai-job-searchby ai-job-search-dev | 100 | 68.9k | today | CLAUDE.md |
Frequently asked questions
- How do I install glance-appwidget-updates-and-memory?
- Run
npx skills add android/skills --skill glance-appwidget-updates-and-memory. The install tabs above show the steps for each supported agent. - Which AI agents does glance-appwidget-updates-and-memory work with?
- It is written for Universal, as a SKILL.md file. Other agents that read the same format can often use it too.
- Is glance-appwidget-updates-and-memory safe to use?
- Our scan of the whole file found no instruction hijacking, hidden characters, credential access, data exfiltration or destructive commands. It is Apache-2.0-licensed and scores 100/100 on trust signals. Skills are instructions an agent will follow, so read the file before installing it and do not approve commands you do not understand.
- Is glance-appwidget-updates-and-memory still maintained?
- The repository was last updated 40 days ago, so glance-appwidget-updates-and-memory is actively maintained.
Skill content
View source on GitHubname: glance-appwidget-updates-and-memory description: Manages Android AppWidget state updates, background syncs, and RemoteViews bitmap memory limits with Jetpack Glance (androidx.glance:glance-appwidget) and AppWidgetProvider receivers on Android 17 (API 37). Use this skill when configuring Android 17 (API level 37) compileSdk/targetSdk and AndroidManifest.xml widget receivers, refreshing frozen or stale Glance widget UI after CoroutineWorker DataStore preference updates (updateAppWidgetState), downsampling images within the WindowMetrics memory limit for SizeMode.Responsive, SizeMode.Exact, or LazyColumn, sharing content:// URIs with FileProvider, or fixing ActionCallback NoSuchMethodException and AppWidgetProvider ForegroundServiceStartNotAllowedException crashes with WorkManager. Don't use for Glance layout templates (suggest the glance-canonical-layouts skill) or in-app Compose screens. license: Complete terms in LICENSE.txt metadata: author: Google LLC last-updated: '2026-10-23' keywords:
- Android
- AppWidget
- Glance
- GlanceAppWidget
- GlanceAppWidgetReceiver
- AppWidgetProvider
- RemoteViews
- widget memory limit
- WindowMetrics
- bitmap memory
- SizeMode.Responsive
- LazyColumn
- ImageProvider
- updateAppWidgetState
- ActionCallback
- NoSuchMethodException
- R8
- ForegroundServiceStartNotAllowedException
- WorkManager
- CoroutineWorker
- FileProvider
- Android 17
- API 37
This skill provides guidance for managing state updates and keeping Android
AppWidgets that use Jetpack Glance (androidx.glance:glance-appwidget) or
RemoteViews within the Android 17 widget bitmap memory limits. For widget UI
layout templates, suggest the glance-canonical-layouts skill.
- When configuring a Glance widget, see Create an app widget with Glance.
- When targeting Android 17 (
targetSdk = 37), see Android 17 widget memory limits. - When maintaining a classic
AppWidgetProvider, see Create an app widget.
Prerequisites
- Kotlin Android project (
minSdk >= 26) withcompileSdk = 37(targetSdk = 37when targeting Android 17) inbuild.gradle.kts. - Jetpack Glance (
1.2.0, minimum1.1.1+) and the Compose compiler Gradle plugin enabled on the module.
Critical mandates
- Preserve existing package name and toolchain versions : Inspect
build.gradle.kts,gradle/libs.versions.toml, and Kotlin files first. Keep existingnamespace,applicationId,package,targetSdk(unless migrating to Android 17), Android Gradle Plugin (AGP), and Kotlin versions. - Downsample images to widget dimensions and estimate the memory cap : Android
system_servercomputes theRemoteViewsbitmap memory cap (6 * width * heightbytes, or1.5 * 4 * width * height) once at boot from the real size of the default display and does not expose this cap in a public API. Because unfolding a foldable or switching display resolution toQHD+after boot can make active window metrics report a larger value than the boot-time cap, always downsample each image first to the widget's target dimensions (maxWidthDp x maxHeightDpinRGB_565orALPHA_8), and enforce the per-image byte ceiling (calculateWidgetMemoryCapBytes(context) / distinctImageCount) estimated as6 * width * heightfromWindowManager.currentWindowMetrics.boundson API 30+ (falling back toresources.displayMetricson API 26-29 or ifWindowManageris unavailable). - Decode shared bitmaps once outside provideContent : Both
SizeMode.Exact(used byglance-canonical-layoutsto compose the current span's portrait and landscape orientations) andSizeMode.Responsive(used to pre-bundle a set ofDpSizebreakpoints) invokeprovideContentmultiple times per update. Decode shared bitmaps once inprovideGlancebeforeprovideContentand pass them toImageProvider(bitmap)soRemoteViewsdeduplicates the sharedBitmapacross all sizes in either mode. If a widget scales distinct bitmaps perLocalSize.current, dividecalculateWidgetMemoryCapBytes(context)by the number of distinct bitmaps. - Downsample content URIs and grant launcher read permissions : On Android 17 (
targetSdk >= 37), bitmap-backedIcons count toward the cap alongsideBitmaps.content://URIs passed toImageProvider(uri)orRemoteViews.setImageViewUridon't count toward the inter-process communication (IPC) cap, but the launcher decodes them at full resolution. Downsample the file intocontext.cacheDir, expose it withFileProvider.getUriForFile, and grantIntent.FLAG_GRANT_READ_URI_PERMISSIONtoIntent.CATEGORY_HOMEpackages. - Trigger explicit widget updates after state mutations :
updateAppWidgetStatewrites preferences to DataStore without updating the widget UI. After you mutate state, callGlanceAppWidget.update(context, glanceId)orGlanceAppWidget.updateAll(context). - Use full updateAppWidget calls when you replace images : In
AppWidgetProviderclasses, when you replace bitmaps orIcons, callAppWidgetManager.updateAppWidgetinstead ofpartiallyUpdateAppWidget.
Reference implementation files
Read the companion reference files in references/ when implementing each step,
and update the sample package declaration and class names to match your app:
- Bitmap Cap & FileProvider Helper : WidgetBitmapUtils.kt
- Responsive Widget, Receiver & Error Fallback : SampleGlanceWidget.kt
- LazyColumn Collection Widget & Revision Cache : FeedCollectionGlanceWidget.kt
- DataStore State Push, CoroutineWorker & ActionCallback : WidgetStateAndActions.kt
- Classic AppWidgetProvider WorkManager & Full Update : ClassicWidgetImageUpdater.kt
- Manifest, Widget Info, FileProvider Paths & R8 Rules : AndroidManifest.xml, sample_widget_info.xml, file_paths.xml, proguard-rules.pro
Detailed steps
Step 1: Configure SDK levels, dependencies, and manifest declarations
- Read
gradle/libs.versions.toml,app/build.gradle.kts, andapp/src/main/AndroidManifest.xmlfirst. If AGP, Kotlin, or library versions are already present, keep them; otherwise, addglance = "1.2.0"along withandroidx.glance:glance-appwidgetandandroidx.glance:glance-material3togradle/libs.versions.toml. - In
app/build.gradle.kts, keepnamespace,applicationId, and any existingminSdk >= 26,targetSdk, or library versions. SetcompileSdk = 37(andtargetSdk = 37only when explicitly migrating the app to target Android 17), enablebuildFeatures { compose = true }, and addimplementation(libs.androidx.glance.appwidget)andimplementation(libs.androidx.glance.material3). - In
AndroidManifest.xml(see AndroidManifest.xml), declare<queries>with<action android:name="android.intent.action.MAIN" />and<category android:name="android.intent.category.HOME" />soqueryIntentActivitiesdiscovers launcher packages on API 30+. Register yourGlanceAppWidgetReceiver(pointingandroid.appwidget.providerto@xml/sample_widget_info, see sample_widget_info.xml) and registerandroidx.core.content.FileProviderwithandroid:authorities="${applicationId}.fileprovider",android:exported="false",android:grantUriPermissions="true", andandroid.support.FILE_PROVIDER_PATHSpointing to@xml/file_paths(which declares<cache-path name="widget_cache" path="widget_images/" />, see file_paths.xml):
<receiver android:name=".glance.MyReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/my_app_widget_info" />
</receiver>
<br />
Step 2: Estimate the widget memory cap and downsample images
Read WidgetBitmapUtils.kt and implement the memory cap and downsampling helpers:
- Estimate the cap (
calculateWidgetMemoryCapBytes) : On API 30+ (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R), readval bounds = context.getSystemService(WindowManager::class.java)?.currentWindowMetrics?.boundsand, whenbounds != null && bounds.width() > 0 && bounds.height() > 0, return6L * bounds.width().toLong() * bounds.height().toLong()(callingWindowManagerfrom a non-UI widget or workerContextlogs a nonfatalStrictModeviolation on API 30+, which is expected for this estimate). On API 26-29 (or ifWindowManageris unavailable), fall back tocontext.resources.displayMetrics(6L * dm.widthPixels.toLong() * dm.heightPixels.toLong()). Becausesystem_servercaches6 * width * heightonce at boot, always size images to the widget'smaxWidthDp x maxHeightDpfirst (Stage 1) rather than filling the full screen budget. - Downsample in two stages (
decodeDownsampledWidgetBitmap) :- First, probe dimensions with
BitmapFactory.Options().apply { inJustDecodeBounds = true; inPreferredConfig = config }and doublesampleSize *= 2while(bounds.outWidth / (sampleSize * 2) >= targetWidthPx && bounds.outHeight / (sampleSize * 2) >= targetHeightPx) || (bounds.outWidth / sampleSize > targetWidthPx * 2) || (bounds.outHeight / sampleSize > targetHeightPx * 2)(wheretargetWidthPx = max(1, (maxWidthDp * density).toInt())), so wide banners or tall screenshots do not bypass downsampling when one axis already fits. - Second, enforce the per-image byte ceiling (
perImageCapBytes = calculateWidgetMemoryCapBytes(context) / max(1, distinctImageCount)) by doublingsampleSize *= 2while(max(1, bounds.outWidth / sampleSize).toLong() * max(1, bounds.outHeight / sampleSize).toLong() * bytesPerPixel) > perImageCapBytes. Use2Lbytes per pixel forBitmap.Config.RGB_565(opaque photos),1LforBitmap.Config.ALPHA_8masks, and4Lwhenbounds.outConfig != null && bounds.outConfig != config(becauseBitmapFactoryupgrades translucent PNG or WebP files fromRGB_565to 4-byteARGB_8888). Decode withinSampleSize = sampleSizeandinPreferredConfig = config.
- First, probe dimensions with
- Choose between in-memory
BitmapandFileProviderUri(cacheWidgetImageUri) : UsedecodeDownsampledWidgetBitmapwithandroidx.glance.ImageProvider(bitmap)when passing bitmaps directly in memory. UsecacheWidgetImageUriwhen the widget passes acontent://UritoImageProvider(uri)orRemoteViews.setImageViewUri: it writes the downsampled bitmap intoFile(context.cacheDir, "widget_images"), obtains acontent://URI withFileProvider.getUriForFile(context, "${context.packageName}.fileprovider", outFile), queriesIntent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME), and callscontext.grantUriPermission(pkg, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION).
Step 3: Deduplicate multi-size bitmaps and handle composition errors
Read SampleGlanceWidget.kt to configure multi-size bitmap deduplication and composition error recovery:
- Choose
SizeModefor your layout : UseSizeMode.Exact(recommended when usingglance-canonical-layoutsto render exactLocalSize.currentdimensions for the current grid span's portrait and landscape orientations), `SizeM
Truncated for display — read the full file on GitHub.
Related Skills
taste-skill
108.3kAgent skills that give coding agents taste: art direction, reference images and a browser check instead of generic AI pages
Agent-Reach
107.8kGive your AI agent eyes to see the entire internet. Read & search Twitter, Reddit, YouTube, GitHub, Bilibili, XiaoHongShu — one CLI, zero API fees.
headroom
78.6kCompress tool outputs, logs, files, and RAG chunks before they reach the LLM. 20% fewer tokens for coding agents, 60-95% fewer tokens for JSON, same answers. Library, proxy, MCP server.
ai-job-search
68.9kThe job search that runs on your machine. AI job application framework built on Claude Code: evaluate postings, tailor CVs, write cover letters, prep interviews. Fork it and own it.
Languages
Trust signals
From repository metadata: license, adoption, age and documentation. Not a code audit — see the Safety scan above for what the skill file itself contains.
