package io.vigour.store;
import android.util.Log;
import com.amazon.device.iap.PurchasingListener;
import com.amazon.device.iap.PurchasingService;
import com.amazon.device.iap.model.Product;
import com.amazon.device.iap.model.ProductDataResponse;
import com.amazon.device.iap.model.PurchaseResponse;
import com.amazon.device.iap.model.PurchaseUpdatesResponse;
import com.amazon.device.iap.model.RequestId;
import com.amazon.device.iap.model.UserDataResponse;
import org.apache.cordova.CallbackContext;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* Created by andrej on 03/09/14.
*/
public class AmazonHandler extends StoreHandler implements PurchasingListener
{
private static String TAG = AmazonHandler.class.getSimpleName();
private String currentUserId = null;
private String currentMarketplace = null;
private RequestId requestId;
private Set<String> skus;
public AmazonHandler(VigourIoStore ioStore) {
super(ioStore);
}
@Override
void getType(final CallbackContext callbackContext) throws Exception
{
callbackContext.success("{\"type\":3}");
}
@Override
void init(JSONArray data, final CallbackContext callbackContext) throws Exception
{
this.callbackContext = callbackContext;
PurchasingService.registerListener(ioStore.cordova.getActivity().getApplicationContext(), this);
Log.i(TAG, "init: sandbox mode is:" + PurchasingService.IS_SANDBOX_MODE);
requestId = PurchasingService.getUserData();
}
@Override
void getProductDetails(JSONArray data, final CallbackContext callbackContext) throws Exception
{
this.callbackContext = callbackContext;
skus = new HashSet<String>();
for (int i=0; i<data.length(); i++){
skus.add(data.get(i).toString());
Log.d(TAG, "Product SKU Added: "+data.get(i).toString());
}
requestId = PurchasingService.getProductData(skus);
}
@Override
void buy(JSONArray data, final CallbackContext callbackContext) throws Exception
{
this.callbackContext = callbackContext;
final String sku = data.getString(0);
requestId = PurchasingService.purchase(sku);
}
@Override
void subscribe(JSONArray data, final CallbackContext callbackContext) throws Exception
{
this.callbackContext = callbackContext;
}
@Override
void getPurchases(JSONArray data, final CallbackContext callbackContext) throws Exception
{
this.callbackContext = callbackContext;
}
@Override
public void onResume()
{
PurchasingService.getUserData();
}
@Override
public void onUserDataResponse(UserDataResponse response)
{
//Log.v("MYTEST", "onUserDataResponse " + response.getRequestId() + " " + requestId);
final UserDataResponse.RequestStatus status = response.getRequestStatus();
switch(status) {
case SUCCESSFUL:
currentUserId = response.getUserData().getUserId();
currentMarketplace = response.getUserData().getMarketplace();
if (requestId.toString().equalsIgnoreCase(response.getRequestId().toString())) {
callbackContext.success();
}
break;
case FAILED:
case NOT_SUPPORTED:
if (requestId.toString().equalsIgnoreCase(response.getRequestId().toString())) {
callbackContext.error("Failed to get user data.");
}
break;
}
}
@Override
public void onProductDataResponse(ProductDataResponse response)
{
// Log.v("MYTEST", "onProductDataResponse " + response.getRequestId() + " " + requestId);
try {
switch (response.getRequestStatus())
{
case SUCCESSFUL:
for (final String s : response.getUnavailableSkus()) {
Log.v(TAG, "Unavailable SKU:" + s);
}
final Map<String, Product> products = response.getProductData();
JSONObject jResponse = new JSONObject();
JSONArray jProducts = new JSONArray();
for (final String key : products.keySet())
{
Product product = products.get(key);
skus.remove(key);
JSONObject jProduct = new JSONObject();
jProduct.put("title", product.getTitle());
jProduct.put("type", product.getProductType());
jProduct.put("price", product.getPrice());
jProduct.put("sku", product.getSku());
jProduct.put("description", product.getDescription());
jProducts.put(new JSONObject().put(key, jProduct));
Log.v(TAG, String.format("Product: %s\n Type: %s\n SKU: %s\n Price: %s\n Description: %s\n", product.getTitle(), product.getProductType(), product.getSku(), product.getPrice(), product.getDescription()));
}
jResponse.put("validProducts", jProducts);
JSONArray invalidSkus = new JSONArray();
for (String invalidSku: skus) {
invalidSkus.put(invalidSku);
}
jResponse.put("invalidProducts", invalidSkus);
if (requestId.toString().equalsIgnoreCase(response.getRequestId().toString())) {
callbackContext.success(jResponse);
}
break;
case FAILED:
if (requestId.toString().equalsIgnoreCase(response.getRequestId().toString())) {
callbackContext.error(response.toString());
}
Log.v(TAG, "ProductDataRequestStatus: FAILED");
break;
}
}
catch(JSONException e)
{
if (requestId.toString().equalsIgnoreCase(response.getRequestId().toString())) {
callbackContext.error(e.getMessage());
}
}
}
@Override
public void onPurchaseResponse(PurchaseResponse response)
{
// Log.v("MYTEST", "onPurchaseResponse " + response.getRequestId() + " " + requestId);
final PurchaseResponse.RequestStatus status = response.getRequestStatus();
try {
if (status == PurchaseResponse.RequestStatus.SUCCESSFUL)
{
JSONObject jResponse = new JSONObject();
jResponse.put("sku", response.getReceipt().getSku());
jResponse.put("receiptId", response.getReceipt().getReceiptId());
jResponse.put("userId", response.getUserData().getUserId());
if (requestId.toString().equalsIgnoreCase(response.getRequestId().toString())) {
callbackContext.success(new JSONObject().put(response.getReceipt().getSku(), jResponse));
}
}
else
{
if (requestId.toString().equalsIgnoreCase(response.getRequestId().toString())) {
callbackContext.error(response.getRequestStatus().toString());
}
}
}
catch (JSONException e)
{
if (requestId.toString().equalsIgnoreCase(response.getRequestId().toString())) {
callbackContext.error(e.getMessage());
}
}
}
@Override
public void onPurchaseUpdatesResponse(PurchaseUpdatesResponse response)
{
//Log.v("MYTEST", "onPurchaseUpdatesResponse " + response.getRequestId() + " " + requestId);
}
}