[PR #6930] [MERGED] [PM-37465] fix: Gate Plan row and Upgraded card on personal Premium #120878

Closed
opened 2026-06-09 19:18:35 -05:00 by GiteaMirror · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/bitwarden/android/pull/6930
Author: @SaintPatrck
Created: 5/15/2026
Status: Merged
Merged: 5/18/2026
Merged by: @SaintPatrck

Base: mainHead: premium-upgrade/pm-37465-personal-vs-org-premium


📝 Commits (2)

  • 3b9ef7e [PM-37465] fix: Gate Plan row and Upgraded card on personal Premium
  • 49bf0a4 Rename AccountJson.Profile.hasPremium to hasPremiumPersonally

📊 Changes

65 files changed (+654 additions, -147 deletions)

View changed files

📝 app/src/main/kotlin/com/x8bit/bitwarden/data/auth/datasource/disk/model/AccountJson.kt (+9 -2)
📝 app/src/main/kotlin/com/x8bit/bitwarden/data/auth/repository/model/UserState.kt (+8 -1)
📝 app/src/main/kotlin/com/x8bit/bitwarden/data/auth/repository/util/GetTokenResponseExtensions.kt (+2 -1)
📝 app/src/main/kotlin/com/x8bit/bitwarden/data/auth/repository/util/UserStateJsonExtensions.kt (+5 -2)
📝 app/src/main/kotlin/com/x8bit/bitwarden/data/billing/manager/PremiumStateManager.kt (+6 -0)
📝 app/src/main/kotlin/com/x8bit/bitwarden/data/billing/manager/PremiumStateManagerImpl.kt (+40 -10)
📝 app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/SettingsViewModel.kt (+18 -31)
📝 app/src/test/kotlin/com/x8bit/bitwarden/MainViewModelTest.kt (+1 -0)
📝 app/src/test/kotlin/com/x8bit/bitwarden/data/auth/datasource/disk/AuthDiskSourceTest.kt (+2 -1)
📝 app/src/test/kotlin/com/x8bit/bitwarden/data/auth/manager/AuthRequestManagerTest.kt (+2 -1)
📝 app/src/test/kotlin/com/x8bit/bitwarden/data/auth/manager/AuthTokenManagerTest.kt (+2 -1)
📝 app/src/test/kotlin/com/x8bit/bitwarden/data/auth/manager/KdfManagerTest.kt (+4 -2)
📝 app/src/test/kotlin/com/x8bit/bitwarden/data/auth/manager/TrustedDeviceManagerTests.kt (+4 -2)
📝 app/src/test/kotlin/com/x8bit/bitwarden/data/auth/manager/UserLogoutManagerTest.kt (+4 -2)
📝 app/src/test/kotlin/com/x8bit/bitwarden/data/auth/manager/UserStateManagerTest.kt (+4 -2)
📝 app/src/test/kotlin/com/x8bit/bitwarden/data/auth/manager/util/TrustDeviceResponseExtensionsTest.kt (+4 -2)
📝 app/src/test/kotlin/com/x8bit/bitwarden/data/auth/repository/AuthRepositoryTest.kt (+4 -2)
📝 app/src/test/kotlin/com/x8bit/bitwarden/data/auth/repository/util/AuthDiskSourceExtensionsTest.kt (+2 -1)
📝 app/src/test/kotlin/com/x8bit/bitwarden/data/auth/repository/util/GetTokenResponseExtensionsTest.kt (+4 -2)
📝 app/src/test/kotlin/com/x8bit/bitwarden/data/auth/repository/util/UserStateJsonExtensionsTest.kt (+215 -29)

...and 45 more files

📄 Description

🎟️ Tracking

📔 Objective

UserState.Account.isPremium collapsed personal and organization-granted Premium into a single aggregate flag. Settings treated all premium users the same, so organization members saw the Plan row and the post-upgrade celebration card despite having no personal subscription to manage or celebrate.

Track personal Premium as a distinct field on UserState.Account (isPremiumFromSelf) and gate the Settings Plan row and the Upgraded-to-Premium card on that field. AccountJson now persists hasPremiumFromOrganization alongside hasPremium so the storage layer no longer collapses the two sources.

The Upgraded-to-Premium card additionally gates eligibility at the read site, not just at the write triggers. Defense-in-depth: pending writes from any source (debug menu, a stray PREMIUM_STATUS_CHANGED push) cannot surface the card unless the active user actually holds personal Premium.

📸 Screenshots

Before After

🔄 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/6930 **Author:** [@SaintPatrck](https://github.com/SaintPatrck) **Created:** 5/15/2026 **Status:** ✅ Merged **Merged:** 5/18/2026 **Merged by:** [@SaintPatrck](https://github.com/SaintPatrck) **Base:** `main` ← **Head:** `premium-upgrade/pm-37465-personal-vs-org-premium` --- ### 📝 Commits (2) - [`3b9ef7e`](https://github.com/bitwarden/android/commit/3b9ef7e40a324a85e567563d7fd51a904e31b48e) [PM-37465] fix: Gate Plan row and Upgraded card on personal Premium - [`49bf0a4`](https://github.com/bitwarden/android/commit/49bf0a46bbbf893c66af6a8df8885bdb8346dfce) Rename AccountJson.Profile.hasPremium to hasPremiumPersonally ### 📊 Changes **65 files changed** (+654 additions, -147 deletions) <details> <summary>View changed files</summary> 📝 `app/src/main/kotlin/com/x8bit/bitwarden/data/auth/datasource/disk/model/AccountJson.kt` (+9 -2) 📝 `app/src/main/kotlin/com/x8bit/bitwarden/data/auth/repository/model/UserState.kt` (+8 -1) 📝 `app/src/main/kotlin/com/x8bit/bitwarden/data/auth/repository/util/GetTokenResponseExtensions.kt` (+2 -1) 📝 `app/src/main/kotlin/com/x8bit/bitwarden/data/auth/repository/util/UserStateJsonExtensions.kt` (+5 -2) 📝 `app/src/main/kotlin/com/x8bit/bitwarden/data/billing/manager/PremiumStateManager.kt` (+6 -0) 📝 `app/src/main/kotlin/com/x8bit/bitwarden/data/billing/manager/PremiumStateManagerImpl.kt` (+40 -10) 📝 `app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/SettingsViewModel.kt` (+18 -31) 📝 `app/src/test/kotlin/com/x8bit/bitwarden/MainViewModelTest.kt` (+1 -0) 📝 `app/src/test/kotlin/com/x8bit/bitwarden/data/auth/datasource/disk/AuthDiskSourceTest.kt` (+2 -1) 📝 `app/src/test/kotlin/com/x8bit/bitwarden/data/auth/manager/AuthRequestManagerTest.kt` (+2 -1) 📝 `app/src/test/kotlin/com/x8bit/bitwarden/data/auth/manager/AuthTokenManagerTest.kt` (+2 -1) 📝 `app/src/test/kotlin/com/x8bit/bitwarden/data/auth/manager/KdfManagerTest.kt` (+4 -2) 📝 `app/src/test/kotlin/com/x8bit/bitwarden/data/auth/manager/TrustedDeviceManagerTests.kt` (+4 -2) 📝 `app/src/test/kotlin/com/x8bit/bitwarden/data/auth/manager/UserLogoutManagerTest.kt` (+4 -2) 📝 `app/src/test/kotlin/com/x8bit/bitwarden/data/auth/manager/UserStateManagerTest.kt` (+4 -2) 📝 `app/src/test/kotlin/com/x8bit/bitwarden/data/auth/manager/util/TrustDeviceResponseExtensionsTest.kt` (+4 -2) 📝 `app/src/test/kotlin/com/x8bit/bitwarden/data/auth/repository/AuthRepositoryTest.kt` (+4 -2) 📝 `app/src/test/kotlin/com/x8bit/bitwarden/data/auth/repository/util/AuthDiskSourceExtensionsTest.kt` (+2 -1) 📝 `app/src/test/kotlin/com/x8bit/bitwarden/data/auth/repository/util/GetTokenResponseExtensionsTest.kt` (+4 -2) 📝 `app/src/test/kotlin/com/x8bit/bitwarden/data/auth/repository/util/UserStateJsonExtensionsTest.kt` (+215 -29) _...and 45 more files_ </details> ### 📄 Description ## 🎟️ Tracking - https://bitwarden.atlassian.net/browse/PM-37465 - https://bitwarden.atlassian.net/browse/PM-37466 ## 📔 Objective `UserState.Account.isPremium` collapsed personal and organization-granted Premium into a single aggregate flag. Settings treated all premium users the same, so organization members saw the Plan row and the post-upgrade celebration card despite having no personal subscription to manage or celebrate. Track personal Premium as a distinct field on `UserState.Account` (`isPremiumFromSelf`) and gate the Settings Plan row and the Upgraded-to-Premium card on that field. `AccountJson` now persists `hasPremiumFromOrganization` alongside `hasPremium` so the storage layer no longer collapses the two sources. The Upgraded-to-Premium card additionally gates eligibility at the read site, not just at the write triggers. Defense-in-depth: pending writes from any source (debug menu, a stray `PREMIUM_STATUS_CHANGED` push) cannot surface the card unless the active user actually holds personal Premium. ## 📸 Screenshots | Before | After | |--------|--------| | <img width="365" src="https://github.com/user-attachments/assets/8756f753-7fef-42e6-b9b6-09d2303b5584" /> | <img width="365" src="https://github.com/user-attachments/assets/c945b516-20a1-4adc-8ee3-853666de32ea" /> | | <img width="365" src="https://github.com/user-attachments/assets/4a5f5ae4-d22c-4d12-9097-bf68dbf4da7b" /> | <img width="365" src="https://github.com/user-attachments/assets/795d01e9-70b0-476e-a414-b4d62f524743" /> | --- <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-09 19:18:35 -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#120878