[PR #6982] [MERGED] [PM-37181] feat: Surface Expired subscription substate #125621

Closed
opened 2026-06-12 05:20:03 -05:00 by GiteaMirror · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/bitwarden/android/pull/6982
Author: @SaintPatrck
Created: 5/27/2026
Status: Merged
Merged: 5/28/2026
Merged by: @SaintPatrck

Base: mainHead: premium-upgrade/pm-37181-expired-unpaid-substate-mapping


📝 Commits (4)

  • 5015f26 PM-37181 feat: Surface Expired and Unpaid subscription substates
  • daa4ef1 Remove UNPAID surface — not a displayed state in our product
  • 7670603 Restore UNPAID to UPDATE_PAYMENT mapping
  • 341d5ea PM-37181: Align Premium copy and scope feature rows to ColumnScope

📊 Changes

11 files changed (+249 additions, -68 deletions)

View changed files

📝 app/src/main/kotlin/com/x8bit/bitwarden/data/billing/manager/PremiumStateManagerImpl.kt (+1 -0)
📝 app/src/main/kotlin/com/x8bit/bitwarden/data/billing/repository/model/PremiumSubscriptionStatus.kt (+7 -0)
📝 app/src/main/kotlin/com/x8bit/bitwarden/data/billing/repository/util/BitwardenSubscriptionResponseJsonExtensions.kt (+2 -3)
📝 app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/premium/plan/PlanScreen.kt (+84 -58)
📝 app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/premium/plan/PlanViewModel.kt (+2 -0)
📝 app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/premium/plan/util/PremiumSubscriptionStatusExtensions.kt (+23 -1)
📝 app/src/test/kotlin/com/x8bit/bitwarden/data/billing/manager/PremiumStateManagerTest.kt (+1 -0)
📝 app/src/test/kotlin/com/x8bit/bitwarden/data/billing/repository/util/BitwardenSubscriptionResponseJsonExtensionsTest.kt (+5 -3)
📝 app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/premium/plan/PlanScreenTest.kt (+95 -2)
📝 app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/premium/plan/PlanViewModelTest.kt (+26 -0)
📝 ui/src/main/res/values/strings.xml (+3 -1)

📄 Description

🎟️ Tracking

PM-37181

📔 Objective

INCOMPLETE_EXPIRED was previously folded onto CANCELED at the JSON boundary, hiding the distinction between an expired subscription and one the user canceled. It now maps to a dedicated EXPIRED UI state with its own label, badge color, and description copy — matching the web client's subscription-card treatment.

For terminal states (CANCELED and EXPIRED), the Premium card swaps the billing line items for the premium feature list so users see a resubscribe-oriented layout rather than charges that no longer apply. Other trouble states (PAST_DUE, PENDING_CANCELLATION, UPDATE_PAYMENT) retain the billing line items.

📸 Screenshots

Figma Actual
Figma Actual

🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/bitwarden/android/pull/6982 **Author:** [@SaintPatrck](https://github.com/SaintPatrck) **Created:** 5/27/2026 **Status:** ✅ Merged **Merged:** 5/28/2026 **Merged by:** [@SaintPatrck](https://github.com/SaintPatrck) **Base:** `main` ← **Head:** `premium-upgrade/pm-37181-expired-unpaid-substate-mapping` --- ### 📝 Commits (4) - [`5015f26`](https://github.com/bitwarden/android/commit/5015f264de88701d8e6bf9e84018153b13e007b0) [PM-37181] feat: Surface Expired and Unpaid subscription substates - [`daa4ef1`](https://github.com/bitwarden/android/commit/daa4ef16e962e589dc67aa421b381781e67e7a90) Remove UNPAID surface — not a displayed state in our product - [`7670603`](https://github.com/bitwarden/android/commit/76706034ac0991730feb0ad4b3c85071a7e21058) Restore UNPAID to UPDATE_PAYMENT mapping - [`341d5ea`](https://github.com/bitwarden/android/commit/341d5ea7596cb72361f58b8d35ed7d4b752cee05) PM-37181: Align Premium copy and scope feature rows to ColumnScope ### 📊 Changes **11 files changed** (+249 additions, -68 deletions) <details> <summary>View changed files</summary> 📝 `app/src/main/kotlin/com/x8bit/bitwarden/data/billing/manager/PremiumStateManagerImpl.kt` (+1 -0) 📝 `app/src/main/kotlin/com/x8bit/bitwarden/data/billing/repository/model/PremiumSubscriptionStatus.kt` (+7 -0) 📝 `app/src/main/kotlin/com/x8bit/bitwarden/data/billing/repository/util/BitwardenSubscriptionResponseJsonExtensions.kt` (+2 -3) 📝 `app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/premium/plan/PlanScreen.kt` (+84 -58) 📝 `app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/premium/plan/PlanViewModel.kt` (+2 -0) 📝 `app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/premium/plan/util/PremiumSubscriptionStatusExtensions.kt` (+23 -1) 📝 `app/src/test/kotlin/com/x8bit/bitwarden/data/billing/manager/PremiumStateManagerTest.kt` (+1 -0) 📝 `app/src/test/kotlin/com/x8bit/bitwarden/data/billing/repository/util/BitwardenSubscriptionResponseJsonExtensionsTest.kt` (+5 -3) 📝 `app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/premium/plan/PlanScreenTest.kt` (+95 -2) 📝 `app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/premium/plan/PlanViewModelTest.kt` (+26 -0) 📝 `ui/src/main/res/values/strings.xml` (+3 -1) </details> ### 📄 Description ## 🎟️ Tracking [PM-37181](https://bitwarden.atlassian.net/browse/PM-37181) ## 📔 Objective `INCOMPLETE_EXPIRED` was previously folded onto `CANCELED` at the JSON boundary, hiding the distinction between an expired subscription and one the user canceled. It now maps to a dedicated `EXPIRED` UI state with its own label, badge color, and description copy — matching the web client's `subscription-card` treatment. For terminal states (`CANCELED` and `EXPIRED`), the Premium card swaps the billing line items for the premium feature list so users see a resubscribe-oriented layout rather than charges that no longer apply. Other trouble states (`PAST_DUE`, `PENDING_CANCELLATION`, `UPDATE_PAYMENT`) retain the billing line items. ## 📸 Screenshots | Figma | Actual | |--------|--------| | <img width="365" src="https://github.com/user-attachments/assets/56ca42cd-e04e-4abb-8bf7-026a1a2f253a" /> | <img width="365" src="https://github.com/user-attachments/assets/81e0cd05-31fa-4e1d-847a-8c220cf060da" /> | | Figma | Actual | |--------|--------| | <img width="365" src="https://github.com/user-attachments/assets/b731f39b-d058-4e33-b911-b8a53b37ba8c" /> | <img width="365" src="https://github.com/user-attachments/assets/6c92de9a-b383-4707-a66a-a30aaea621c2" /> | [PM-37181]: https://bitwarden.atlassian.net/browse/PM-37181?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
GiteaMirror added the pull-request label 2026-06-12 05:20:03 -05:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github-starred/android#125621