[PR #6690] [MERGED] [PM-33512] feat: Add PremiumStateManager for upgrade banner eligibility #100171

Closed
opened 2026-05-31 04:43:04 -05:00 by GiteaMirror · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/bitwarden/android/pull/6690
Author: @SaintPatrck
Created: 3/18/2026
Status: Merged
Merged: 3/19/2026
Merged by: @SaintPatrck

Base: mainHead: premium-upgrade/PM-33512-premium-state-manager


📝 Commits (1)

  • ace84e2 [PM-33512] feat: Add PremiumStateManager for upgrade banner eligibility

📊 Changes

4 files changed (+579 additions, -0 deletions)

View changed files

📝 app/src/main/kotlin/com/x8bit/bitwarden/data/billing/di/BillingModule.kt (+30 -0)
app/src/main/kotlin/com/x8bit/bitwarden/data/billing/manager/PremiumStateManager.kt (+23 -0)
app/src/main/kotlin/com/x8bit/bitwarden/data/billing/manager/PremiumStateManagerImpl.kt (+123 -0)
app/src/test/kotlin/com/x8bit/bitwarden/data/billing/manager/PremiumStateManagerImplTest.kt (+403 -0)

📄 Description

🎟️ Tracking

https://bitwarden.atlassian.net/browse/PM-33512

📔 Objective

Add PremiumStateManager that consolidates all premium upgrade banner eligibility logic into a single StateFlow<Boolean>. This centralizes the eligibility decision so downstream consumers (e.g., VaultViewModel, Settings) observe one signal instead of combining multiple flows themselves.

Eligibility formula (all must be true):

  • User is not premium
  • In-app billing is supported (Play Billing or F-Droid)
  • MobilePremiumUpgrade feature flag is enabled
  • Banner has not been dismissed
  • Account is at least 7 days old
  • Vault contains at least 5 non-deleted items

Changes:

  • PremiumStateManager interface with isPremiumUpgradeBannerEligibleFlow and dismissPremiumUpgradeBanner()
  • PremiumStateManagerImpl combining 5 upstream flows via combine with Clock injection for account age calculation
  • BillingModule wiring with @Provides @Singleton
  • 18 unit tests covering all eligibility conditions, boundary values, DataState variants, and reactive updates

🔄 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/6690 **Author:** [@SaintPatrck](https://github.com/SaintPatrck) **Created:** 3/18/2026 **Status:** ✅ Merged **Merged:** 3/19/2026 **Merged by:** [@SaintPatrck](https://github.com/SaintPatrck) **Base:** `main` ← **Head:** `premium-upgrade/PM-33512-premium-state-manager` --- ### 📝 Commits (1) - [`ace84e2`](https://github.com/bitwarden/android/commit/ace84e2bb31f8a8be7df11509938a3bcb5028f3e) [PM-33512] feat: Add PremiumStateManager for upgrade banner eligibility ### 📊 Changes **4 files changed** (+579 additions, -0 deletions) <details> <summary>View changed files</summary> 📝 `app/src/main/kotlin/com/x8bit/bitwarden/data/billing/di/BillingModule.kt` (+30 -0) ➕ `app/src/main/kotlin/com/x8bit/bitwarden/data/billing/manager/PremiumStateManager.kt` (+23 -0) ➕ `app/src/main/kotlin/com/x8bit/bitwarden/data/billing/manager/PremiumStateManagerImpl.kt` (+123 -0) ➕ `app/src/test/kotlin/com/x8bit/bitwarden/data/billing/manager/PremiumStateManagerImplTest.kt` (+403 -0) </details> ### 📄 Description ## 🎟️ Tracking https://bitwarden.atlassian.net/browse/PM-33512 ## 📔 Objective Add `PremiumStateManager` that consolidates all premium upgrade banner eligibility logic into a single `StateFlow<Boolean>`. This centralizes the eligibility decision so downstream consumers (e.g., `VaultViewModel`, Settings) observe one signal instead of combining multiple flows themselves. **Eligibility formula** (all must be true): - User is not premium - In-app billing is supported (Play Billing or F-Droid) - `MobilePremiumUpgrade` feature flag is enabled - Banner has not been dismissed - Account is at least 7 days old - Vault contains at least 5 non-deleted items **Changes:** - `PremiumStateManager` interface with `isPremiumUpgradeBannerEligibleFlow` and `dismissPremiumUpgradeBanner()` - `PremiumStateManagerImpl` combining 5 upstream flows via `combine` with `Clock` injection for account age calculation - `BillingModule` wiring with `@Provides @Singleton` - 18 unit tests covering all eligibility conditions, boundary values, `DataState` variants, and reactive updates --- <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-05-31 04:43:05 -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#100171