Repository navigation
Redesign the widget setup, widget, and app screens - #69
Merged
Merged
Conversation
- Widget gains header_color (curated palette: amber, neutral, dark, dynamic) and a nullable per-widget sort_order. Migration 3 to 4 maps black and dark-grey widgets to the dark header, the rest to amber. - matching() and SortOrder.comparator() extract the profile matching and sorting from the RemoteViews factory, so the widget and the app screens can share them. - room-testing plus the schema exports in debug assets let MigrationTestHelper run under Robolectric. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- DDWidgetProvider keeps its name (placed widgets depend on it) and is now a GlanceAppWidgetReceiver; WidgetService, the RemoteViews factory and its layouts are gone. - The widget has system corner radii, a tonal header from the curated palette (or the wallpaper colours), "7 apps · updated 15:12", app name before package, and quieter uninstall/app-details actions. - A widget whose profile matches nothing explains it and offers "Choose apps" instead of showing a blank list. - WidgetContentLoader assembles a widget's apps from the shared matching, honouring a per-widget sort order over the Settings one. App icons are scaled to the 40 dp they are drawn at. - widget_info: Glance loading layout, picker description, target size, reconfigurable; drops the unused autoAdvanceViewId. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Placing a widget from the launcher's picker opened the widget editor for a widget that was never saved (only the pin flow saved one), and the configure activity never returned RESULT_OK. Now the configure intent opens a setup screen: "Which apps should this widget show?", answered with one of your apps (signature filter), a package pattern, or an existing profile, with a live count of the apps that will appear. Done creates the profile and filter, saves the widget named after the profile, returns RESULT_OK and closes. Leaving without finishing keeps the result cancelled. The widget's empty state opens the same setup for an existing widget. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Widgets list: each card shows the widget's header colour, its profile
and how many apps it lists, instead of the internal "ID: 5". A widget
whose profile matches nothing says "No apps match · Choose apps" and
opens setup.
Widget editor: a live preview of the widget, the curated header palette
(wallpaper colours on Android 12+) instead of the 11 raw colours,
profiles as radio rows with app counts so the selection is visible, and
a per-widget sort order ("Default (…)" keeps the Settings value).
Also fixes Settings' sort labels: they were mapped by enum position, so
"Last updated" and "First installed" were swapped.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Today a tap edits a profile, a long press deletes it, and swiping does either, with nothing on screen showing how to delete. Now a tap opens the profile and each card's overflow menu offers Duplicate and Delete. Deleting is immediate with Undo in a snackbar (the profile's filters come back too); a profile that widgets still use keeps the in-use dialog. Cards show "1 filter · 7 apps" and which widgets use the profile. The delete confirmation dialog and its strings are gone, replaced by undo. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The profile editor lists filters in plain language ("Signed like
DevDrawer2", "Package matches com.example.*") with each filter's own
app count, and a live "Matching apps (N)" list of what the profile
shows, updated as filters are added or removed before saving.
One "Add filter" button opens a sheet that explains both filter types
in a sentence each. Tapping a filter shows its details; the close icon
removes it (nothing is saved until Save, so no confirmation).
The per-filter preview dialog and the delete-filter confirmation are
gone, with their now-unused strings.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- "Show activity choice on launch" becomes "Ask which screen to open", with a summary explaining when it applies. - "Widget Sorting Options" becomes "Default sort order": it now only applies to widgets without their own order. - The "User Interface" category becomes "Appearance" (sentence case). German follows. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Remove resources the redesign orphaned: the old widget-row icons and their tint colour, and eight strings no screen uses any more. - Read the Profiles snackbar's strings through LocalResources, which follows configuration changes (lint error). - "Show all" in setup reuses the profile editor's string instead of a string lint wants as a plural. - CLAUDE.md: Glance widget, setup route and configure result, shared app matching, database version 4, and the Robolectric-based UI, Glance and migration tests. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Widget: a running Glance session only recomposes on update(), so
Reload and app-triggered updates could show stale apps. A refresh
token in the widget's Glance state now makes the session reload;
UpdateReceiver and RefreshAction bump it.
- Widget: list at most 40 apps (with "+N more apps") and store icons
at 72 px at most, keeping the RemoteViews under the Binder limit.
- An invalid package pattern ("com.(") now matches nothing instead of
throwing in every screen that matches apps.
- Setup: Done can't create a second profile while saving.
- Back from setup opened by the launcher or the widget closes the app
(a widget being placed is then removed, as the launcher expects);
in-app setup still goes back.
- Editors only reload app labels and icons when filters, profile, sort
order or installed apps change, not on every name keystroke; the
Widgets list reads installed apps once.
- The profile editor's matching apps reuse AppInfoItem.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Test Results90 tests +43 90 ✅ +43 28s ⏱️ -1s Results for commit de8ed6e. ± Comparison against base commit 21f22eb. This pull request removes 20 and adds 63 tests. Note that renamed tests count towards both.♻️ This comment has been updated with latest results. |
The app-signature filter picker was a dialog with an unlabelled icon toggle for system apps. It is now a bottom sheet with a one-line explanation, a search field (name or package), an "Include system apps" chip, and recently updated apps first. Tapping an app adds it; swiping the sheet away cancels. App icons in Compose now go through one AppIcon composable that renders at a fixed size: converting at the drawable's own size failed for drawables without one. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Legacy widget colours now migrate to their closest header colour instead of falling back to amber, and the editor's swatches wrap onto a second row. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The blocking opt-in dialog could cover a new widget's setup and kept its buttons disabled for 2.5 seconds. It is now a dismissable card that only appears on the Widgets tab. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Widgets placed with the app's "Add widget" button were saved straight away with the first profile (or a new empty "Default" one) and never went through setup. The launcher's confirmation now opens setup for the new widget once the app is back in front; until then the widget shows its "Choose apps" state. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The widget editor lost unsaved changes on back without asking. Changes now save immediately; the name saves once typing pauses or the editor closes, and a blank name keeps the saved one. "Delete widget" only wiped the settings of a widget that stayed on the home screen. It is replaced by a hint on how to remove the widget there. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The profile editor needed an explicit Save and asked "Discard changes?" on back, unlike the widget editor. Filters now save when added or removed, with an Undo snackbar for removals, and the name saves once typing pauses or the editor closes. The filter list and its matching apps are now derived from the same emission so they never disagree. The app bar actions plumbing had no users left and is removed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Implements the UX proposals from the design canvas, including moving the home-screen widget to Jetpack Glance. Nine commits, each self-contained with its tests:
Widgetgets a curatedheader_colorand a per-widgetsort_order. The migration from 3 to 4 maps black and dark-grey widgets to the dark header, and has a migration test. App matching and sorting are shared inapps/AppMatching.kt.DDWidgetProviderkeeps its name and becomes aGlanceAppWidgetReceiver. The widget gets system corners, a tonal header, app name before package, and an empty state with "Choose apps". The RemoteViews service, factory and layouts are removed.CLAUDE.md.Bugs fixed along the way
RESULT_OK.Testing
runGlanceAppWidgetUnitTest) and Room migration tests. Lint reports no errors, andassembleDebugsucceeds.🤖 Generated with Claude Code