THE REAL FIX
Patch CustomerInfo.getActiveSubscriptions() to return a non-empty set.
Root cause: The JS app checks activeSubscriptions.length > 0 FIRST in hasActiveEntitlementOrSubscription(). If the user never subscribed, RevenueCat returns an empty set. Our EntitlementInfo.isActive() patch was useless because there were ZERO EntitlementInfo objects to call it on.
Fix: CustomerInfo.getActiveSubscriptions() now returns Collections.singleton("premium") so JS sees an active subscription and calls setIsPremiumUser(true).