package com.alorma.github.ui.activity;
import android.app.Activity;
import android.app.Fragment;
import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentSender;
import android.content.ServiceConnection;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import com.android.vending.billing.IInAppBillingService;
import java.util.ArrayList;
import java.util.Collections;
import java.util.UUID;
import org.json.JSONException;
import org.json.JSONObject;
/**
* Created by bernat.borras on 24/10/15.
*/
public class PurchasesFragment extends Fragment {
private static final String SKU_MULTI_ACCOUNT = "com.alorma.github.multiaccount";
private IInAppBillingService mService;
ServiceConnection mServiceConn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
mService = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mService = IInAppBillingService.Stub.asInterface(service);
}
};
private String purchaseId;
private PurchasesCallback purchasesCallback;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
createBillingService();
}
private void createBillingService() {
Intent serviceIntent = new Intent("com.android.vending.billing.InAppBillingService.BIND");
serviceIntent.setPackage("com.android.vending");
if (mService == null) {
getActivity().bindService(serviceIntent, mServiceConn, Context.BIND_AUTO_CREATE);
}
}
public void checkSku(PurchasesCallback purchasesCallback) {
this.purchasesCallback = purchasesCallback;
SKUTask task = new SKUTask();
task.execute(SKU_MULTI_ACCOUNT);
}
public void finishPurchase(int requestCode, int resultCode, Intent data, PurchasesCallback callback) {
if (requestCode == 1001) {
String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA");
if (resultCode == Activity.RESULT_OK) {
try {
JSONObject jo = new JSONObject(purchaseData);
String sku = jo.getString("productId");
String developerPayload = jo.getString("developerPayload");
if (callback != null) {
boolean purchased = developerPayload.equals(purchaseId) && SKU_MULTI_ACCOUNT.equals(sku);
callback.onMultiAccountPurchaseResult(purchased);
}
} catch (JSONException e) {
e.printStackTrace();
}
} else {
int response_code = data.getIntExtra("RESPONSE_CODE", 0);
if (callback != null) {
callback.onMultiAccountPurchaseResult(response_code == 6);
}
}
}
}
public void showDialogBuyMultiAccount() {
try {
purchaseId = UUID.randomUUID().toString();
Bundle buyIntentBundle = mService.getBuyIntent(3, getActivity().getPackageName(), SKU_MULTI_ACCOUNT, "inapp", purchaseId);
PendingIntent pendingIntent = buyIntentBundle.getParcelable("BUY_INTENT");
getActivity().startIntentSenderForResult(pendingIntent.getIntentSender(), 1001, new Intent(), 0, 0, 0);
} catch (RemoteException | IntentSender.SendIntentException e) {
e.printStackTrace();
}
}
public interface PurchasesCallback {
void onMultiAccountPurchaseResult(boolean multiAccountPurchased);
}
private class SKUTask extends AsyncTask<String, Void, Bundle> {
@Override
protected Bundle doInBackground(String... strings) {
if (strings != null) {
ArrayList<String> skuList = new ArrayList<>();
Collections.addAll(skuList, strings);
Bundle querySkus = new Bundle();
querySkus.putStringArrayList("ITEM_ID_LIST", skuList);
try {
return mService.getPurchases(3, getActivity().getPackageName(), "inapp", null);
} catch (RemoteException e) {
e.printStackTrace();
}
}
return null;
}
@Override
protected void onPostExecute(Bundle ownedItems) {
super.onPostExecute(ownedItems);
if (ownedItems != null) {
int response = ownedItems.getInt("RESPONSE_CODE");
if (response == 0) {
ArrayList<String> ownedSkus = ownedItems.getStringArrayList("INAPP_PURCHASE_ITEM_LIST");
if (ownedSkus != null && purchasesCallback != null) {
purchasesCallback.onMultiAccountPurchaseResult(!ownedSkus.isEmpty());
}
}
}
}
}
}