Repository navigation
Conversation
Without Supporter, today's penguin can now be chosen as the app icon: floor(unix seconds / 86400) mod 48 over the fixed catalogue order, by UTC day. iOS and Android compute the day themselves when applying the icon and never trust Dart for it. The icon never changes automatically: a chosen icon stays until the user changes it, and only the new day's penguin becomes selectable. Supporters can still choose any of the 48. The picker shows today's penguin in its own card with when the next one arrives, tags its grid tile "Free today", and explains daily access at the end of the list. The nine standard icons now show their real Home Screen backgrounds, from small WebP previews (about 44 KB in total) rather than the full-size icons. Copy: the Support us card, benefit and access lines now describe the free daily penguin and appearance-only Supporter extras, and the icon names that were still English in de, es, fr, ja and ko are translated. Existing approved translations are kept.
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
Automated PR reviewHead: Review unavailable: Incomplete model answer (length); manual review required. Remaining gates
No PR code runs with the model key or write token. Free-only routing; provider/rate-limit failures never authorize a merge. Existing review findings must be resolved, not hidden by a new recommendation. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 7af69948aa
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| final source = brightness == Brightness.dark ? darkAsset ?? asset : asset; | ||
| final name = source.split('/').last.replaceAll('.png', ''); | ||
| return 'assets/app_icons/picker/standard-$name.webp'; |
There was a problem hiding this comment.
Update the existing preview-asset assertions for the new paths
The existing test the nine visible free choices are available on every icon platform in test/supporter_icons_test.dart:123–134 still expects previewAsset to return launcher PNG paths for pilot and blue. This implementation instead returns standard-*.webp paths, so those assertions will fail. Update the standard-icon expectations and either retain nonstandard-icon behavior or revise those assertions to match the intended API. The Quality workflow (.github/workflows/quality.yml:145) runs the full test suite, making this a required-check failure rather than just stale test documentation. Flutter is unavailable locally, so this mismatch was verified by inspecting the implementation and assertions.
AGENTS.md reference: AGENTS.md:L19-L20
Useful? React with 👍 / 👎.
headerChromePaddingOf comes from the Duo top padding change (#281); this PR keeps the existing header inset so it builds on its own.
The interface size screen's header uses the same corner-cluster padding as the other headers. It was missing from this PR and landed in #284 instead.
…s in tests previewAsset returned a standard-picker path for every icon, including the 48 penguins that have none. It again returns the launcher artwork, and the standard tiles use the new standardPickerAsset. The supporter icon tests tapped penguins that now sit below the standard icons and today's free penguin, outside what the 800x600 test list builds. They scroll a tile into view before tapping or inspecting it.
Change
Without Supporter, today's penguin can now be chosen as the app icon. The nine standard icons in the picker show their real Home Screen backgrounds.
floor(unixSeconds / 86400) mod 48over the fixed catalogue order (01-pilot ... 48-stargazing), by UTC day.AppIconVariant.dailyPenguinOrder(Dart),dailyPenguinOrder(AppDelegate.swift) andpaidIcons(MainActivity.kt) share that order. Native code computes the day itself when it applies the icon and never trusts Dart for it.tool/optimize_app_artwork.py --checkpasses.test/supporter_icons_test.dartis updated for the renamed keys.Affected platforms: iOS and Android (alternate app icons); picker UI on mobile.
Related PRs and canonical PR (or
None; existing PRs checked): this is the canonical PR for this change. Open and recently closed PRs were checked; none covers it. It ships alongside #281, #282 and #283, which are independent fixes from the same request. Each touches different code and is useful alone.Telegram API Terms classification
Follow the contribution and agentic review rules. Select exactly one classification and explain it below.
This is an agentic source-code review classification. Every store version must remain compliant with applicable Telegram API Terms; the guarded-source exception does not apply to store distribution or review.
allowTelegramTosViolations(I_DONT_FUCKING_CARE_ABOUT_TOS), disabled in official builds, and available only in an explicitly enabled self-build.Reason and affected Telegram behavior:
App icon selection and local cosmetic entitlements only; no Telegram API usage or behavior changes.
Basic checks (every PR)
Check each item after verification. If a check is inapplicable, explain why in the evidence below before checking it.
dart format --output=none --set-exit-if-changed lib test integration_test test_driver.flutter analyze.flutter test --concurrency=4.Commands, results, platform/build/UI evidence, and reasons for inapplicable checks:
dart format --output=none --set-exit-if-changed lib test integration_test test_driverwith the Dart 3.12.2 SDK from Flutter 3.44.2: 0 changed.dart analyze --fatal-infos(the same analysis server and rulesflutter analyzeuses, Flutter 3.44.2 SDK): No issues found on this branch alone and on all four PRs combined.flutter testcould not run in the authoring sandbox (Alpine/musl host), so the tests box stays unchecked until Quality CI reports on this PR head. No new tests were added, at the maintainer's request.python3 translations/tools/check.py(8 locales x 4059 keys OK),python3 translations/tools/gen_assets.py --check(up to date),python3 tool/check_l10n_strings.py,python3 tool/gen_registration_anchors.py --check,python3 tool/optimize_app_artwork.py --check: all pass.MainActivity.ktchange was not compiled locally; Android build paths rely on CI.I_DONT_FUCKING_CARE_ABOUT_TOS=false). Together the four branches match the tested source, apart from two lint-only edits in fix(ios): start opened iPhone Duo panes beside the status cluster #281.Section 1.4 exception checks
Not applicable: compliant change, no guarded behavior.
--dart-define=I_DONT_FUCKING_CARE_ABOUT_TOS=false, the feature is absent and ordinary Telegram behavior remains intact.--dart-define=I_DONT_FUCKING_CARE_ABOUT_TOS=true, the feature works through the guarded entry points in a self-build; I included relevant test and build/UI evidence.falseand have no option that enables it. All store versions remain compliant with applicable Telegram API Terms.Guard locations and evidence for each flag variant: Not applicable.
Agentic reviewer confirmation
Agentic code reviewer only: record this confirmation in the PR review or check these boxes before approval.