Repository navigation
feat(pro): include Pro on ExpressiveOS - #43
Conversation
When the launcher runs on ExpressiveOS, every Pro feature is unlocked without a license. Detection compares the SHA-256 of the "android" package's platform signing certificate with ExpressiveOS's release platform cert (be94c373...), so a GitHub or Play update over the bundled copy keeps Pro, while resetprop props or a systemized APK on another ROM don't unlock it. - ProManager: isIncludedWithRom; isPro stays true when a license is missing, expires, fails or is deactivated; no trial-ended notice. - ProGate: unlocked on ExpressiveOS regardless of a license's mask. - Banner and Pro sheet: "Included with ExpressiveOS", no trial card, Donate / Offline Key / Deactivate copy that is true on the ROM. - RomEntitlementTest: 8 Robolectric tests. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
|
The failing task is So this is pre-existing, repo-wide formatting debt on the base branch ( The checks that actually exercise this change are green or running: Generated by Claude Code |
Requested by Daryl
Description
When Expressive Launcher runs on ExpressiveOS, every Pro feature is unlocked without a license. Licenses, trials and donations keep working everywhere else, and on ExpressiveOS too for anyone who wants to support development. This is the scaffold for "no pro gates when the launcher is bundled in the ROM". No release build is part of this PR.
Reasoning
androidpackage's platform signing certificate must equal ExpressiveOS's release platform certbe94c373…f48. On the build server that cert isvendor/evolution-priv/keys/platform.x509.pem, and the builtframework-res.apkis signed with it. It differs from EvoX (2d5efc1e…), DerpFest (8d1eb9cd…) and the AOSP test key (c8a2e9bc…).ro.evolution.*, which would switch Pro off for real ExpressiveOS users.ProManager.isIncludedWithRomis computed once per process.isProstays true when a license is missing, expires, fails verification or is deactivated, and no "trial ended" notice is shown.ProGateunlocks regardless of a separately entered license's feature mask.Testing
./gradlew testLawnWithQuickstepExpressiveDebugUnitTest --tests 'app.lawnchair.pro.*': 54/54 pass, including 8 new tests inRomEntitlementTest. They cover the cert match and mismatch, the real PackageManager path not throwing, Pro without a license, deactivate keeping Pro, trial expiry keeping Pro with no notice on the ROM, and trial expiry still returning to Free elsewhere.spotlessApplywas run on the changed files.spotlessCheckstill fails on the base branch because of files this PR doesn't touch (ExpressiveCore.kt, FeedBridge.kt, …). Two remaining ktlint notes are in untouched code:INSTANCEnaming in ProManager and multiple emitters in ProActiveContent.Type of change
❌ Bug fix (A non-breaking change that fixes an issue)
✅ New feature (A non-breaking change that adds functionality)
❌ Breaking change (A fix or feature that would cause existing functionality to not work as expected)
❌ Refactor (A code change that neither fixes a bug nor adds a feature)
❌ Performance (A code change that improves performance)
❌ Style (Code style changes)
❌ Docs (Changes to documentation)
❌ Chore (Changes to the build process or other tooling)
🤖 Generated with Claude Code