Fix & Standardize Galaxy Date Parsing Edge Cases#3216
Conversation
…venueCat/purchases-android into galaxy/fix-date-parsing-issue
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #3216 +/- ##
=======================================
Coverage 79.41% 79.41%
=======================================
Files 356 356
Lines 14342 14342
Branches 1958 1958
=======================================
Hits 11389 11389
Misses 2149 2149
Partials 804 804 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
tonidero
left a comment
There was a problem hiding this comment.
This PR might be missing a part? Lmk if I'm missing something though! In any case, I think the changes in this PR make sense!
| import java.util.Locale | ||
| import java.util.TimeZone | ||
|
|
||
| @Throws(IllegalArgumentException::class) |
There was a problem hiding this comment.
Unfortunately kotlin doesn't force callers to handle exceptions :( But I think it's better to add it 👍
There was a problem hiding this comment.
Agreed - better to have it than not!
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
|
@tonidero Good callout on the I've also updated the parsing code in both Let me know what you think! |
**This is an automatic release.** ## RevenueCat SDK ### 🐞 Bugfixes * Fix & Standardize Galaxy Date Parsing Edge Cases (#3216) via Will Taylor (@fire-at-will) * Fix addSuccessfullyPostedToken for new purchases in PostPendingTransactionsHelper (#3239) via Facundo Menzella (@facumenzella) * [Galaxy]: Fix race condition when fetching Galaxy products (#3213) via Will Taylor (@fire-at-will) * Fixes double padding in PaywallActivity on Android 15+ when `edgeToEdge` parameter is false (#3227) via Cesar de la Vega (@vegaro) ## RevenueCatUI SDK ### 🐞 Bugfixes * Fix bold text not rendering in Markdown lists (#3228) via Cesar de la Vega (@vegaro) * Fix: Clear in-memory offerings cache on locale override to prevent stale paywall data (#3225) via Antonio Pallares (@ajpallares) ### Paywallv2 #### ✨ New Features * Feature: Update default paywall (#3133) via Jacob Rakidzich (@JZDesign) #### 🐞 Bugfixes * Fix V2 paywall safe area in landscape mode (#3221) via Cesar de la Vega (@vegaro) ### 🔄 Other Changes * Run integration tests on all branches (#3242) via Toni Rico (@tonidero) * Migrate Firebase Test Lab jobs to CircleCI emulators (#3238) via Toni Rico (@tonidero) * Run metalava on galaxy module in test-galaxy job (#3235) via Will Taylor (@fire-at-will) * Add offering_id to custom paywall impression event (#3230) via Rick (@rickvdl) * Cache isAutoRenewing to detect subscription changes without syncPurchases (#3198) via Facundo Menzella (@facumenzella) * Bump fastlane-plugin-revenuecat_internal from `e146447` to `3e8c384` (#3233) via dependabot[bot] (@dependabot[bot]) <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Low risk release housekeeping: version string bumps and documentation/deployment path updates with no functional runtime logic changes beyond the exposed version constant. > > **Overview** > Publishes the `9.26.0` release by removing `-SNAPSHOT` across build/version metadata (root `VERSION_NAME`, `.version`, `Config.frameworkVersion`, and sample/test app dependency pins). > > Updates release documentation artifacts by adding the `9.26.0` notes to `CHANGELOG.md`/`CHANGELOG.latest.md`, switching docs deployment in CircleCI to sync `docs/9.26.0` to S3, and updating `docs/index.html` to redirect to the new version. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 0a30a45. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->

Description
Cursor pointed out that if subscription end date parsing fails, an exception is thrown and
finish()is never called, which can halt execution. This PR fixes that by handling subscription end date parsing failures gracefully and ignoring the affected product instead of failing the whole flow.Additionally, this PR updates the
.toStoreTransaction()calls inqueryPurchases()andqueryAllPurchases()so that individual parsing failures cause only the affected transaction to be skipped, while successfully parsed transactions are still returned. The methods now fail only if parsing fails for all transactions.This matches the existing partial-failure behavior used by the Amazon implementation of
queryPurchases()andqueryAllPurchases().Note
Medium Risk
Changes purchase restore/query behavior to skip malformed Galaxy owned products and only error when all transactions are invalid, which could affect edge-case restore results. Also adds new date-parse error handling to avoid stalled serial execution on parsing exceptions.
Overview
Hardens Galaxy purchase restore/query flows against malformed store data.
queryAllPurchasesandqueryPurchasesnow usemapNotNullto skip individual owned products that failtoStoreTransaction()parsing, and only returnInvalidReceiptErrorwhen the owned list is non-empty but no valid transactions could be parsed.queryPurchasesadditionally guardssubscriptionEndDate.parseDateFromGalaxyDateString()with a try/catch, logging and filtering out entries with invalid end dates so serial execution always completes. New standardized strings were added for transaction and subscription-end-date parsing errors, and tests were updated/added to cover partial-failure filtering and the all-invalid error case.Written by Cursor Bugbot for commit 6c69286. This will update automatically on new commits. Configure here.