fix(upgrade): Cover widget entry refresh and recorder edge cases

- WidgetConfigurationActivity refreshes the entitlement on resume: it is a
  second launcher entry point and can't rely on MainActivity reconciling.
- The upgrade-return callback re-asks decideConfirm() instead of trusting the
  upgrade activity's result code, so RESULT_OK stays entitlement-gated.
- RecorderModule stops the freshly started recorder when the header's
  diagnostics reads are cancelled, instead of leaking an untracked recording.
- FOSS beta channel points at the GitHub releases page; the Play testing URL
  is signature-incompatible for FOSS builds.
- Billing bug reports carry the contextual wrapper again, so the report is
  grouped by call site instead of the raw billing exception.

Fixes review findings F1, F2, F3, F4, F5.
This commit is contained in:
darken
2026-07-29 14:05:26 +02:00
committed by Matthias Urhahn
parent 3651bb3d55
commit e364a5b02c
6 changed files with 133 additions and 12 deletions
@@ -381,7 +381,7 @@ class BillingManager @Inject constructor(
private fun reportPermanentAckFailure(purchase: Purchase, error: Exception) {
if (reportedAckFailures.add(purchase.purchaseToken)) {
log(TAG, ERROR) { "Permanent ack failure for ${purchase.redacted()}:\n${error.asLog()}" }
Bugs.report(TAG, "Failed to acknowledge purchase", error)
Bugs.report(TAG, "Failed to acknowledge purchase", RuntimeException("Failed to acknowledge purchase", error))
} else {
log(TAG, WARN) { "Permanent ack failure (already reported) for ${purchase.redacted()}" }
}
@@ -461,10 +461,10 @@ class BillingManager @Inject constructor(
)
when {
e !is BillingException -> {
Bugs.report(TAG, "State exception for $sku, U", e)
Bugs.report(TAG, "State exception for $sku, U", RuntimeException("State exception for $sku, U", e))
}
e is BillingClientException && !e.result.responseCode.let { ignoredCodes.contains(it) } -> {
Bugs.report(TAG, "Client exception for $sku", e)
Bugs.report(TAG, "Client exception for $sku", RuntimeException("Client exception for $sku", e))
}
}