Skip to content

[Brand design updates - Core App Components] Move brand update pictograms/icon into production resources - #9732

Open
mikescamell wants to merge 21 commits into
developfrom
feature/mikescamell/move-brand-update-pictograms-and-icons-to-prod
Open

[Brand design updates - Core App Components] Move brand update pictograms/icon into production resources#9732
mikescamell wants to merge 21 commits into
developfrom
feature/mikescamell/move-brand-update-pictograms-and-icons-to-prod

Conversation

@mikescamell

@mikescamell mikescamell commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Task/Issue URL: https://app.asana.com/1/137249556945/project/488551667048375/task/1216795442294569?focus=true
Tech Design URL (if applicable):
API Proposals URL(s) (if applicable):

Description

  • Move the 2026 pictograms and icons into production resources while retaining legacy fallback resources.
  • Rename resources to match the Icons repository, remove unused duplicates, and pin layouts where intrinsic dimensions differ.
  • Update artwork for Duck.ai, subscriptions, App Tracking Protection, Site Permissions, Fire, widgets, settings, browser errors, Autofill, bookmarks, sync, and VPN surfaces.
  • Scale wide remote-message artwork correctly and add wide artwork examples to the Android Design System preview.

Steps to test this PR

Use an internalRelease build (release preferable for subscription testing) build on a physical device. Do not use an emulator for these checks.
Start with a clean installation.
The appBrandDesignUpdate flags are now true by default; leave them unchanged for new-behaviour checks.

Changed behaviour

  • Open Settings → Other Settings → Permissions → Site Permissions.
  • Start with no allowed-site rows using a fresh test profile or the screen's Remove All action.
  • Verify only the empty state text is shown.
  • Open Settings → Other Settings → Internal Features → Feature Flag Inventory.
  • Set the pictograms child under appBrandDesignUpdate to false.
  • Force-stop the app.
  • Relaunch the app.
  • Reopen Site Permissions.
  • Verify the legacy Site Permissions empty-state illustration is shown.
  • Set the pictograms child under appBrandDesignUpdate to true in Feature Flag Inventory.
  • Force-stop the app.
  • Relaunch the app.
  • Create a DuckAiPlus test subscription in the supplied Internal release build.
  • Open Settings → Other Settings → AI Features.
  • Tap the enabled Duck.ai subscription row.
  • Verify the paid-settings header uses the updated Duck.ai artwork.
  • Open Settings → Protections → App Tracking Protection.
  • Complete App Tracking Protection onboarding.
  • Grant Android VPN permission.
  • Verify App Tracking Protection is running.
  • Open a regular New Tab page.
  • Verify the shield icon is the leading item before the dynamic summary text.
  • Open Settings → Protections → App Tracking Protection.
  • Turn off App Tracking Protection for All Apps
  • Go back to the New Tab page.
  • Verify the exclamation icon is the leading item before the dynamic summary text.
  • Ensure you have the app or device in light theme
  • Open the tab switcher.
  • Switch to Fire mode tabs.
  • If Fire tabs exist, use the overflow menu to select Close All Tabs and confirm Close.
  • Verify the Fire Tabs empty state uses the light Fire window artwork.
  • Select New Fire Tab.
  • Verify the Fire Tab new-tab empty state uses the light Fire window artwork.
  • Close that Fire tab.
  • Set the app theme to Dark through Settings → Other Settings → Appearance → Theme.
  • Open the tab switcher.
  • Switch to Fire mode tabs.
  • Verify zero Fire tabs; if any remain, use the overflow menu to select Close All Tabs and confirm Close.
  • Verify the Fire Tabs empty state uses the dark Fire window artwork.
  • Select New Fire Tab.
  • Verify the Fire Tab new-tab empty state uses the dark Fire window artwork.

Widgets and remote-message artwork

Some devices cache widget-picker previews. If a preview does not update after force-stopping and relaunching DuckDuckGo, restart the launcher or device before reopening the Widgets picker.

  • Launch the DuckDuckGo app once.
  • Long-press an empty area on the launcher.
  • Open the launcher's Widgets picker.
  • Open the DuckDuckGo provider group.
  • Select the Search Only provider entry.
  • Verify the Search Only preview uses the 2026 artwork.
  • Return to the DuckDuckGo provider list.
  • Select the Search and Favorites provider entry.
  • Verify the Search and Favorites preview uses the 2026 artwork.
  • Close the Widgets picker before changing an app flag.
  • Open Settings → Other Settings → Internal Features → Feature Flag Inventory.
  • Set the addressBar child under appBrandDesignUpdate to false.
  • Force-stop the app.
  • Relaunch the app.
  • Open the launcher's Widgets picker again.
  • Open the DuckDuckGo provider group again.
  • Select the Search Only provider entry again.
  • Verify the Search Only preview uses the legacy artwork.
  • Return to the DuckDuckGo provider list again.
  • Select the Search and Favorites provider entry again.
  • Verify the Search and Favorites preview uses the legacy artwork.
  • Close the launcher's Widgets picker after checking the legacy previews.
  • Open Settings → Other Settings → Internal Features → Feature Flag Inventory.
  • Restore the addressBar child under appBrandDesignUpdate to true.
  • Force-stop the app.
  • Relaunch the app.
  • Open Settings → Other Settings → Internal Features.
  • Open Android Design System Preview.
  • Enable Brand design update switch at in the screen toolbar
  • Select the Messaging tab.
  • Scroll to the Remote Messaging Framework section header.
  • Ensure Enable Dark Theme is off; tap the switch only if it is on.
  • Verify Medium Message shows the complete critical_update_96 illustration inside its card.
  • Verify Big Single Message shows the complete announcement_96 illustration inside its card.
  • Verify the Big Two Actions Message card with the DuckDuckGo illustration shows the complete duckduckgo_96 illustration inside its card.
  • Verify the Big Two Actions Message card whose subtitle mentions the app update shows the complete update_96 illustration inside its card.
  • Verify the DuckDuckGo on desktop card is present.
  • Verify the DuckDuckGo on desktop card shows desktop_promo_artwork without clipping.
  • Verify the A fresh new look card is present with the light theme selected.
  • Verify the A fresh new look card uses the light visual-design artwork.
  • Ensure Enable Dark Theme is on; tap the switch only if it is off.
  • Wait for the preview activity to relaunch.
  • Select the Messaging tab again.
  • Verify the A fresh new look card is present with the dark theme selected.
  • Verify the A fresh new look card uses the dark visual-design artwork.

Smoke test

Switch to playRelease build (just for sanity)

  • Open Settings → Other Settings → Appearance.
  • Verify Change app icon is the first setting.
  • On a device/profile where Passwords & Autofill is visible, open Settings → Other Settings → Passwords & Autofill.
  • Under Import Passwords, select Sync Desktop Passwords.
  • Verify the Import Passwords screen shows the updated desktop-sync artwork.
  • Tap Get Desktop Browser.
  • Verify the desktop-browser promotion shows the laptop_ddginstall_96 artwork.
  • Open Settings → Scroll to Protections section.
  • Verify each visible protection row's leading icon uses the updated icons.
  • From the browser menu, open Bookmarks at the root level using a clean profile with no bookmarks or folders.
  • Verify the root empty state (No bookmarks added yet) shows the updated bookmarks_import_128 artwork.
  • Open Settings → Other Settings → Sync & Backup.
  • Select Get Desktop Browser.
  • Verify the destination shows the updated ddg_app_download_96 download artwork.
  • Verify the displayed link is duckduckgo.com/app.
  • Open Subscription Settings from the DuckDuckGo Subscription section using an active PLUS subscription.
  • Verify the Upgrade to Pro row is visible with Unlock more powerful AI and the updated ai_chat_advanced_color_24 icon.
  • Open a new tab, navigate to https://invalid.invalid/.
  • Wait for the main-frame load to fail.
  • Verify the browser error page (not the offline/connection page) shows the current-theme Dax artwork at its 296dp maximum width.
  • Open ign.com check that the trackers animation plays
  • Turn of tracking protection
  • Check the unprotected shield shows

Addendum testing — production app icons

  • Install the 5.295.0 playRelease from this task
  • Open Settings → Other Settings → Appearance → Change app icon, select Pink, and verify that the selected launcher icon changes.
  • Install the playRelease build with our icon changes from this task
  • Check that the icon is updated on the launcher to the new pink version
  • After the in-place update, open Settings → Other Settings → Appearance → Change app icon and verify the previously selected icon/component remains selected and now shows the new pink icon in the picker.
  • In Settings → Other Settings → Appearance → Change app icon, apply Red and verify its picker and launcher artwork.
  • In Settings → Other Settings → Appearance → Change app icon, apply Pink and verify its picker and launcher artwork.
  • In Settings → Other Settings → Appearance → Change app icon, apply Gold and verify its picker and launcher artwork.
  • In Settings → Other Settings → Appearance → Change app icon, apply Green and verify its picker and launcher artwork.
  • In Settings → Other Settings → Appearance → Change app icon, apply Blue and verify its picker and launcher artwork.
  • In Settings → Other Settings → Appearance → Change app icon, apply Purple and verify its picker and launcher artwork.
  • In Settings → Other Settings → Appearance → Change app icon, apply Black and verify its picker and launcher artwork.
  • In Settings → Other Settings → Appearance → Change app icon, apply Silhouette and verify its picker and launcher artwork.
  • Long-press the launcher icon, open the app shortcuts, and verify the New Tab shortcut shows the updated version with new orange.
  • Long-press the launcher icon, open the app shortcuts, and verify the Fire shortcut shows the updated version with new orange.
  • Long-press the launcher icon, open the app shortcuts, and verify the Bookmarks shortcut shows the updated version with new orange.
  • Long-press the launcher icon, open the app shortcuts, and verify the Duck.ai shortcut shows the updated version with new orange.
  • Uninstall the app
  • Fresh install the playRelease build with our icon changes
  • Check the icon in the launcher is the new up to date red icon
  • [Optional] Check icons in Settings again

UI changes

See here for screenshots


Note

Low Risk
Mostly drawable renames and layout @drawable swaps with no logic changes; verify ad-blocking/Duck Player headers and YouTube warning sheets render correctly at the new sizes.

Overview
Continues the 2026 brand pictogram rollout in ad-blocking and design-system surfaces by pointing UI at renamed production drawables (e.g. video_player_color_24, ads_blocked_color_24) and shared header art.

Ad-blocking / Duck Player: Settings entry rows use the new common icon names. Ad-blocking and Duck Player settings headers switch from module-specific vectors (ad_blocking_header_128, clean_tube_128) to youtube_clean_128. Warning bottom sheets now use youtube_warning_128 (with a new 128dp asset and a rescaled youtube_warning_96). Legacy module drawables are removed where replaced.

Omnibar: The ad-blocking omnibar badge still uses ic_video_player_blocked_color_24, with a TODO to move to video_player_color_24 when the address-bar brand flag is removed.

Design system: Remote-message gallery, Compose previews, and DaxPageHeader samples reference the Icons-repo naming (announcement_96, duckduckgo_96, update_96, subscription_128, laptop_ddginstall_96, etc.). The internal remote-message layout adds preview slots for wide desktop promo and wide top-illustration (visual design update) messages. Lint baseline entries are updated for renamed/moved vector assets.

Reviewed by Cursor Bugbot for commit 2ad2835. Bugbot is set up for automated code reviews on this repo. Configure here.

@mikescamell mikescamell changed the title Move rebrand pictograms into production resources [Brand design updates - Core App Components] Move brand update pictograms/icon into production resources Sep 7, 2026
@mikescamell
mikescamell force-pushed the feature/mikescamell/move-brand-update-pictograms-and-icons-to-prod branch 3 times, most recently from 04b7d01 to a531e11 Compare September 8, 2026 10:02
Promote rebrand overrides from the app internal source set into each owning module main resources. Keep module-local copies where modules intentionally share artwork, preserving explicit ownership and resource isolation. Preserve legacy ic_duck_ai while applying the new artwork only to ic_duckai, with size-tier corrections regenerated as needed.

Artwork in this import is regenerated from the current Icons-Main Color/24px sources with vd-tool; Video Player remains intentionally duplicated in the app and design-system owners.
Retain same-module alias cleanup while restoring intentional cross-module copies and module-local resource references. Preserve the theme-tinted AppTP warning in app and vpn-impl, keep distinct legacy and new Duck.ai resources, and replace older VPN artwork in network-protection and subscriptions. Identity remains in both owner modules; app onboarding resolves the design-system copy through CommonR for F-Droid while subscriptions stays local.

Both Identity Blocked PIR owner copies use the source-generated mapped artwork; subscriptions canonical bytes are sourced from its deleted alias.
Rename each retained module-local pictogram independently to its Icons repository name and update Kotlin, XML, tests, and lint baselines. Keep intentional cross-module duplication explicit, including the VPN artwork replacement in network-protection and subscriptions. Preserve cookie_color_24_1, the Duck.ai legacy/new split, and the YouTube 96/128 consumer split.

Identity Blocked PIR remains intentionally duplicated in design-system and subscriptions; C3 renames only the design-system alias and updates the app CommonR reference.

Also cut over the ungated Duck.ai settings icon and subscription VPN onboarding header to their canonical production resources, and retain the Cookie-Blocked artwork under its canonical cookie_blocked_color_24 name.

� Conflicts:
�	app/src/main/res/drawable/image_get_desktop_browser.xml
�	app/src/main/res/drawable/laptop_ddginstall_96.xml
�	autofill/autofill-impl/src/main/res/layout/activity_get_desktop_app.xml
�	desktop-app-promotion/desktop-app-promotion-impl/src/main/res/drawable/image_get_desktop_browser.xml
�	desktop-app-promotion/desktop-app-promotion-impl/src/main/res/layout/activity_desktop_app_promotion.xml
Pin personal_information_remover_128 (base 320x240, new 128x96) at 320dp x 240dp, and ic_autofill_keychain (base 220x170, new 128x96) at 220dp x 170dp. These pins preserve current rendering pending design review.
Not ALL unused pictograms, just based on what we've added and changed. The rest will get removed in a follow-up project.
Hiding this was missed from the pictograms work
Was missed in previous Pictograms work
Igor's export ships light and dark variants but only the light one was
imported, so dark mode rendered the light artwork. Adds
fire_window_dark_phone_96 and a dedicated daxDrawableFireWindowPhone attr.

daxDrawableTabPlaceholderPreview could not be reused: outside fire mode it
resolves to the Dax icon for the tab-switcher placeholder.
The illustration slot was a fixed 64dp box with scaleType="center", which
centres at intrinsic size without scaling, so every 96dp pictogram lost its
outer 16dp band and the 256x144 assets showed only their middle quarter.

Placeholder.drawable() is shared by all message shapes, so desktop_promo_artwork
and ic_visual_design_update_artwork_* can reach this slot as well as the promo
layout. Capping height only keeps their aspect: 114x64 and 101x64.
layout_constrainedWidth guards against a server-supplied asset overflowing the
card. The 64dp dimen is unchanged and read by this view alone.
SearchWidgetProviderInfoUpdater already selects between the default provider
metadata and legacy_provider_info on the addressBar toggle, but the 2026
previews were internal-flavour only and search_widget_preview_aliases.xml
redirected each 2026 name back to the legacy drawable, so both branches of the
switch rendered the same pre-rebrand preview on play and fdroid.

The four provider-info pairs differ only in previewImage, so promoting the six
drawables and dropping the alias file is enough to make the toggle work. The
*_legacy_* drawables and *_widget_info_legacy*.xml are the flag-off route and
are retained.
The 2026 shield is a 24dp glyph, so the 48dp trailing slot oversized it. Puts
it before the header text and moves the hardcoded margins onto keylines.
@mikescamell
mikescamell force-pushed the feature/mikescamell/move-brand-update-pictograms-and-icons-to-prod branch from a531e11 to f14332e Compare September 8, 2026 10:28
@mikescamell
mikescamell force-pushed the feature/mikescamell/move-brand-update-pictograms-and-icons-to-prod branch from 75957bd to 2afd8f2 Compare September 9, 2026 13:55
title = context.getString(R.string.syncGetAppsOnOtherPlatformsTitle),
body = context.getString(R.string.syncGetAppsOnOtherPlatformInstruction),
illustration = CommonR.drawable.ddg_app_download_128,
illustration = CommonR.drawable.ddg_app_download_96,

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@catalinradoiu I updated the artwork here to 96 as we discussed 👍

@mikescamell
mikescamell marked this pull request as ready for review September 9, 2026 14:14
@mikescamell mikescamell closed this Sep 9, 2026
@mikescamell mikescamell reopened this Sep 9, 2026
@mikescamell

Copy link
Copy Markdown
Contributor Author

@LukasPaczos this is ready for review 👍

@LukasPaczos LukasPaczos left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verify the displayed link is duckduckgo.com/app.

I'm seeing "duckduckgo.cm/browser".

Image

Shield icon is not centered. Is this expected? If not and pre-existing, let's consider as follow up to align.


private fun showBadge(): AdBlockingAnimation.Show =
AdBlockingAnimation.Show(
// TODO update to new video_player_color_24.xml resource when AppBrandDesignUpdateToggles.addressBar() is removed

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we have a task for this? Might be good linking here.

Comment on lines -1 to -2
<!--
~ Copyright (c) 2026 DuckDuckGo

@LukasPaczos LukasPaczos Sep 10, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems unintentional. Same missing copyright headers in other files.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants