diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/utils/SettingsFile.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/utils/SettingsFile.java index 35c51118b..7f3328673 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/utils/SettingsFile.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/utils/SettingsFile.java @@ -37,6 +37,8 @@ public final class SettingsFile { public static final String KEY_DESIGN = "design"; + public static final String KEY_PREMIUM = "premium"; + public static final String KEY_HW_RENDERER = "use_hw_renderer"; public static final String KEY_HW_SHADER = "use_hw_shader"; public static final String KEY_SHADERS_ACCURATE_MUL = "shaders_accurate_mul"; diff --git a/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainActivity.java b/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainActivity.java index 14205cce1..83aff3f48 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainActivity.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainActivity.java @@ -42,6 +42,8 @@ public final class MainActivity extends AppCompatActivity implements MainView { // Singleton to manage user billing state private static BillingManager mBillingManager; + private static MenuItem mPremiumButton; + @Override protected void onCreate(Bundle savedInstanceState) { ThemeUtil.applyTheme(); @@ -98,9 +100,22 @@ public final class MainActivity extends AppCompatActivity implements MainView { public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu_game_grid, menu); + mPremiumButton = menu.findItem(R.id.button_premium); + + if (mBillingManager.isPremiumCached()) { + // User had premium in a previous session, hide upsell option + setPremiumButtonVisible(false); + } + return true; } + static public void setPremiumButtonVisible(boolean isVisible) { + if (mPremiumButton != null) { + mPremiumButton.setVisible(isVisible); + } + } + /** * MainView */ diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/BillingManager.java b/src/android/app/src/main/java/org/citra/citra_emu/utils/BillingManager.java index 6fa3ff1d2..ccd6546a6 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/utils/BillingManager.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/BillingManager.java @@ -1,6 +1,8 @@ package org.citra.citra_emu.utils; import android.app.Activity; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; import com.android.billingclient.api.BillingClient; import com.android.billingclient.api.BillingClientStateListener; @@ -12,6 +14,10 @@ import com.android.billingclient.api.PurchasesUpdatedListener; import com.android.billingclient.api.SkuDetails; import com.android.billingclient.api.SkuDetailsParams; +import org.citra.citra_emu.CitraApplication; +import org.citra.citra_emu.features.settings.utils.SettingsFile; +import org.citra.citra_emu.ui.main.MainActivity; + import java.util.ArrayList; import java.util.List; @@ -25,12 +31,18 @@ public class BillingManager implements PurchasesUpdatedListener { private boolean mIsServiceConnected = false; private Runnable mUpdateBillingCallback; + private static SharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(CitraApplication.getAppContext()); + public BillingManager(Activity activity) { mActivity = activity; mBillingClient = BillingClient.newBuilder(mActivity).enablePendingPurchases().setListener(this).build(); querySkuDetails(); } + static public boolean isPremiumCached() { + return mPreferences.getBoolean(SettingsFile.KEY_PREMIUM, false); + } + /** * @return true if Premium subscription is currently active */ @@ -58,10 +70,23 @@ public class BillingManager implements PurchasesUpdatedListener { mBillingClient.launchBillingFlow(mActivity, flowParams); } + private void updatePremiumState(boolean isPremiumActive) { + mIsPremiumActive = isPremiumActive; + + // Cache state for synchronous UI + SharedPreferences.Editor editor = mPreferences.edit(); + editor.putBoolean(SettingsFile.KEY_PREMIUM, isPremiumActive); + editor.apply(); + + // No need to show button in action bar if Premium is active + MainActivity.setPremiumButtonVisible(!isPremiumActive); + } + @Override public void onPurchasesUpdated(BillingResult billingResult, List purchaseList) { if (purchaseList == null || purchaseList.isEmpty()) { // Premium is not active, or billing is unavailable + updatePremiumState(false); return; } @@ -74,7 +99,7 @@ public class BillingManager implements PurchasesUpdatedListener { if (premiumPurchase != null) { // Premium has been purchased - mIsPremiumActive = true; + updatePremiumState(true); if (mUpdateBillingCallback != null) { try { @@ -123,6 +148,7 @@ public class BillingManager implements PurchasesUpdatedListener { private void onQueryPurchasesFinished(PurchasesResult result) { // Have we been disposed of in the meantime? If so, or bad result code, then quit if (mBillingClient == null || result.getResponseCode() != BillingClient.BillingResponseCode.OK) { + updatePremiumState(false); return; } // Update the UI and purchases inventory with new list of purchases