21+ Gems , Purchase Cache

This commit is contained in:
Negue 2015-12-01 01:04:47 +01:00
parent 4b08ee92a4
commit b6201ae5a3
4 changed files with 75 additions and 57 deletions

View file

@ -15,7 +15,7 @@
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="+ 20"
android:text="+ 21"
android:id="@+id/btn.purchase.gems"
android:layout_gravity="center_horizontal"
android:drawableRight="@drawable/ic_header_gem"

View file

@ -18,21 +18,20 @@ import com.raizlabs.android.dbflow.config.FlowManager;
import org.solovyev.android.checkout.Billing;
import org.solovyev.android.checkout.Cache;
import org.solovyev.android.checkout.Checkout;
import org.solovyev.android.checkout.Inventory;
import org.solovyev.android.checkout.ProductTypes;
import org.solovyev.android.checkout.Products;
import org.solovyev.android.checkout.PurchaseVerifier;
import org.solovyev.android.checkout.RequestListener;
import java.io.File;
import java.util.Arrays;
import java.util.concurrent.Executor;
/**
* Created by Negue on 14.06.2015.
*/
public class HabiticaApplication extends Application {
public static String Purchase20Gems = "com.habitrpg.android.habitica.iap.20.gems";
public static HabiticaApplication Instance;
public static HabitRPGUser User;
@ -44,7 +43,7 @@ public class HabiticaApplication extends Application {
Instance = this;
billing.connect();
createBillingAndCheckout();
FlowManager.init(this);
@ -78,7 +77,7 @@ public class HabiticaApplication extends Application {
return new File(getExternalFilesDir(null), "HabiticaDatabase/" + name);
}
public static void logout(Context context){
public static void logout(Context context) {
Instance.deleteDatabase(HabitDatabase.NAME);
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = preferences.edit();
@ -87,7 +86,7 @@ public class HabiticaApplication extends Application {
context.startActivity(new Intent(context, LoginActivity.class));
}
public static void checkUserAuthentication(Context context, HostConfig hostConfig){
public static void checkUserAuthentication(Context context, HostConfig hostConfig) {
if (hostConfig == null || hostConfig.getApi() == null || hostConfig.getApi().equals("") || hostConfig.getUser() == null || hostConfig.getUser().equals("")) {
context.startActivity(new Intent(context, LoginActivity.class));
}
@ -97,47 +96,41 @@ public class HabiticaApplication extends Application {
// region IAP - Specific
private void createBillingAndCheckout() {
billing = new Billing(this, new Billing.DefaultConfiguration() {
@NonNull
@Override
public String getPublicKey() {
return "DONT-NEED-IT";
}
@Nullable
@Override
public Cache getCache() {
return Billing.newCache();
}
@Override
public PurchaseVerifier getPurchaseVerifier() {
return new HabiticaPurchaseVerifier(HabiticaApplication.this);
}
});
checkout = Checkout.forApplication(billing, Products.create().add(ProductTypes.IN_APP, Arrays.asList(Purchase20Gems)));
}
/**
* For better performance billing class should be used as singleton
*/
@NonNull
private final Billing billing = new Billing(this, new Billing.Configuration() {
@NonNull
@Override
public String getPublicKey() {
return "DONT-NEED-IT";
}
@Nullable
@Override
public Cache getCache() {
return Billing.newCache();
}
@Override
public PurchaseVerifier getPurchaseVerifier() {
return new HabiticaPurchaseVerifier();
}
@Override
public Inventory getFallbackInventory(Checkout checkout, Executor executor) {
return null;
}
@Override
public boolean isAutoConnect() {
return false;
}
});
public static String Purchase20Gems = "com.habitrpg.android.habitica.iap.20.gems";
private Billing billing;
/**
* Application wide {@link org.solovyev.android.checkout.Checkout} instance (can be used anywhere in the app).
* This instance contains all available products in the app.
*/
@NonNull
private final Checkout checkout = Checkout.forApplication(billing, Products.create().add(ProductTypes.IN_APP, Arrays.asList(Purchase20Gems)));
private Checkout checkout;
@NonNull

View file

@ -1,5 +1,9 @@
package com.habitrpg.android.habitica;
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import com.magicmicky.habitrpgwrapper.lib.models.PurchaseValidationRequest;
import com.magicmicky.habitrpgwrapper.lib.models.PurchaseValidationResult;
import com.magicmicky.habitrpgwrapper.lib.models.Transaction;
@ -9,36 +13,56 @@ import org.solovyev.android.checkout.Purchase;
import org.solovyev.android.checkout.RequestListener;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* Created by Negue on 26.11.2015.
*/
public class HabiticaPurchaseVerifier extends BasePurchaseVerifier {
private Set<String> purchasedOrderList = new HashSet<>();
static String PURCHASED_PRODUCTS_KEY = "PURCHASED_PRODUCTS";
private SharedPreferences preferences;
public HabiticaPurchaseVerifier(Context context) {
preferences = PreferenceManager.getDefaultSharedPreferences(context);
preferences.getStringSet(PURCHASED_PRODUCTS_KEY, purchasedOrderList);
}
@Override
protected void doVerify(final List<Purchase> purchases, final RequestListener<List<Purchase>> requestListener) {
final List<Purchase> verifiedPurchases = new ArrayList<Purchase>(purchases.size());
final List<Purchase> verifiedPurchases = new ArrayList<>(purchases.size());
for(final Purchase purchase : purchases)
{
PurchaseValidationRequest validationRequest = new PurchaseValidationRequest();
validationRequest.transaction = new Transaction();
validationRequest.transaction.receipt = purchase.data;
validationRequest.transaction.signature = purchase.signature;
PurchaseValidationResult purchaseValidationResult = HabiticaApplication.ApiHelper.validatePurchase(validationRequest);
if (purchaseValidationResult.ok) {
for (final Purchase purchase : purchases) {
if (purchasedOrderList.contains(purchase.orderId)) {
verifiedPurchases.add(purchase);
requestListener.onSuccess(verifiedPurchases);
}
else
{
requestListener.onError(purchases.indexOf(purchase), new Exception(purchaseValidationResult.data.toString()));
}
} else {
PurchaseValidationRequest validationRequest = new PurchaseValidationRequest();
validationRequest.transaction = new Transaction();
validationRequest.transaction.receipt = purchase.data;
validationRequest.transaction.signature = purchase.signature;
PurchaseValidationResult purchaseValidationResult = HabiticaApplication.ApiHelper.validatePurchase(validationRequest);
if (purchaseValidationResult.ok) {
purchasedOrderList.add(purchase.orderId);
verifiedPurchases.add(purchase);
requestListener.onSuccess(verifiedPurchases);
} else {
requestListener.onError(purchases.indexOf(purchase), new Exception(purchaseValidationResult.data.toString()));
}
}
}
SharedPreferences.Editor edit = preferences.edit();
edit.putStringSet(PURCHASED_PRODUCTS_KEY, purchasedOrderList);
edit.apply();
}
}

View file

@ -32,12 +32,13 @@ import io.fabric.sdk.android.Fabric;
*/
public class GemsPurchaseFragment extends BaseFragment {
static final int GEMS_TO_ADD = 21;
private BillingRequests billingRequests;
@InjectView(R.id.btn_purchase_gems)
Button btnPurchaseGems;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
@ -60,7 +61,7 @@ public class GemsPurchaseFragment extends BaseFragment {
billingRequests.consume(purchase.token, new RequestListener<Object>() {
@Override
public void onSuccess(Object o) {
EventBus.getDefault().post(new BoughtGemsEvent(20));
EventBus.getDefault().post(new BoughtGemsEvent(GEMS_TO_ADD));
}
@Override
@ -106,7 +107,7 @@ public class GemsPurchaseFragment extends BaseFragment {
billingRequests.consume(purchase.token, new RequestListener<Object>() {
@Override
public void onSuccess(Object o) {
EventBus.getDefault().post(new BoughtGemsEvent(20));
EventBus.getDefault().post(new BoughtGemsEvent(GEMS_TO_ADD));
}
@Override