Repository navigation
Sell a yearly pass in Lite, and ask for support in the reader - #740
Merged
Merged
Conversation
Lite sells one auto-renewing subscription, `pro_pass`, which removes the ads and unlocks the Pro features for one year. A sheet offers it with one statement about what the money pays for, and a link to the Pro app for users who want to pay once. The sheet replaces the "Part of Pro" dialog, so the gate keeps its feature text as the sheet's first line. "Support the app" opens the sheet from the landing screen, from the document actions, from the house ad, and from the snackbar after the user enters fullscreen. Foss shows the same row, but it goes to GitHub Sponsors. Pro keeps only its sponsor row in the folded settings, because its users have paid already. BillingManager now asks Play at each launch, because a pass ends. Old one-time purchases for life give the Pro features. The old one-year purchase and the old subscription keep only the ad removal. An ended pass takes effect at the next launch, because AdManager does not turn back on once it removes the ads. A new pass renders the open document again, because the editing scope is set while translating. If the edit mode is on, the render waits until the edit mode ends, so no edit is lost. Without Play or without the product, the sheet shows only the Pro link. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VUF78xeGqXrWLtQovh2RqU
The snackbar after fullscreen starts said "Tap OK to remove the ads for free", but OK now opens the purchase sheet. The new text says that OK shows how to remove the ads. The string has a new key, so the old translations no longer show the wrong promise. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VUF78xeGqXrWLtQovh2RqU
- Set Features.unlocked before the check for Play. A Play Services fix runs initializeManagers again, and a pass holder then kept Lite's editing scope until the next launch. - Render the page again when the edit mode ends whenever the tools say that Pro is on. A restore during the first render left the page with paragraph scope, and leaving the edit mode did not fix it. - Drop billing answers that arrive after PlayBilling.end, so an old BillingManager does not change the ads or the preferences. - Answer the waiting calls when Play disconnects before the setup finishes. Otherwise no later call starts a connection. - Sell only the base plan "yearly", so a later prepaid plan in the same product does not take its place. - Fold offersPass into offersSupport, and remove a check that could never matter. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VUF78xeGqXrWLtQovh2RqU
- A tap on the pass in the gate sheet now also reports pro_gate_tapped, as OpenDocument.ios does for its gate. - A restore at launch shows "Your purchase is restored" and reports pass_restored. Only a purchase from the sheet says thank you and reports pass_unlocked. PlayBilling knows the difference, because a purchase arrives through the purchases listener. - After a pass ends during a session, the fullscreen snackbar does not offer ad removal until the next launch, when the ads return. - The screen-tour caption names the new "Support the app" row. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VUF78xeGqXrWLtQovh2RqU
andiwand
added a commit
that referenced
this pull request
Oct 31, 2026
The yearly pass in Lite is new in this release, so the version is a minor one. #740 added no changelog entry, so the cut adds one. Translations come for the 18 strings of the pass, the Pro gate and "Support the app". The Lite listing no longer says that the ads can be removed for free, because that option is gone. 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.
🤖 Generated with Claude Code
Summary
Lite sells one auto-renewing subscription,
pro_pass. It removes the ads and unlocks the Pro features for one year. The decision note is in headquarters:notes/2026-10-25_yearly-pass.md.MainActivity.offerPassshows a title, the gate's feature text (only from the gate), one statement about what the money pays for, the pass with the price from Play, the renewal terms, and a link to the Pro app. The sheet replaces the "Part of Pro" dialog. Without Play or without the product, the sheet shows only the Pro link.BillingManagerasks Play at each launch, because a pass ends.Entitlement.ofmaps the owned products:remove_ads_for_eva,love_and_everything) give Pro.remove_ads_for_1yandremove_ads_subscriptionkeep only the ad removal.AdManagerdoes not turn back on once it removes the ads.Features.advancedEditingnow reads the entitlement. A new pass renders the open document again, becauseCoreLoadersets the editing scope while it translates. If the edit mode is on, the render waits until the edit mode ends, so no edit is lost.Features.onPlay. This flag comes from thereview/noReviewsource sets and separates Pro from Foss.OwnedPurchases, the "Remove advertisements" string in all locales, andic_block.The reader entry is a row in the document actions, not a link beside the banner. AdMob policy discourages tappable elements close to an ad, because they cause accidental clicks.
Before release
Create the subscriptionDone: base planpro_passin the Play Console for Lite.yearly, auto-renewing, active in 178 countries at €2.99 (US $2.79 before sales tax, UK £2.49).RewordDone in e2ac51c: the new keycrouton_remove_ads.crouton_passsays that OK shows how to remove the ads.pass_*,menu_support, andcrouton_passstrings.Test plan
./gradlew spotlessCheck assembleDebug lintProDebug lintLiteDebug lintFossDebugtestProDebugUnitTest testLiteDebugUnitTest, including the newEntitlementTestconnectedAndroidTest