/*
* Copyright (C) 2017 Vasily Styagov.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.octo.bear.pago;
import android.content.Context;
import android.os.Bundle;
import java.util.ArrayList;
import java.util.List;
import io.octo.bear.pago.model.entity.Order;
import io.octo.bear.pago.model.entity.Purchase;
import io.octo.bear.pago.model.entity.PurchaseType;
import io.octo.bear.pago.model.entity.ResponseCode;
import io.octo.bear.pago.model.exception.BillingException;
import rx.Single;
import static io.octo.bear.pago.BillingServiceUtils.GSON;
import static io.octo.bear.pago.BillingServiceUtils.checkResponseAndThrowIfError;
import static io.octo.bear.pago.BillingServiceUtils.retrieveResponseCode;
/**
* Created by shc on 18.07.16.
*/
class PurchasedItemsSingle extends Single<List<Order>> {
static final String RESPONSE_INAPP_PURCHASE_ITEM_LIST = "INAPP_PURCHASE_ITEM_LIST";
static final String RESPONSE_INAPP_PURCHASE_DATA_LIST = "INAPP_PURCHASE_DATA_LIST";
static final String RESPONSE_INAPP_PURCHASE_SIGNATURE_LIST = "INAPP_DATA_SIGNATURE_LIST";
static final String RESPONSE_INAPP_CONTINUATION_TOKEN = "INAPP_CONTINUATION_TOKEN";
PurchasedItemsSingle(final Context context, final PurchaseType type) {
super((OnSubscribe<List<Order>>) subscriber ->
new BillingServiceConnection(context, service -> {
try {
final Bundle purchases =
service.getPurchases(Pago.BILLING_API_VERSION, context.getPackageName(), type.value, null);
final ResponseCode code = retrieveResponseCode(purchases);
checkResponseAndThrowIfError(code);
final List<String> data = purchases.getStringArrayList(RESPONSE_INAPP_PURCHASE_DATA_LIST);
final List<String> signatures = purchases.getStringArrayList(RESPONSE_INAPP_PURCHASE_SIGNATURE_LIST);
if (data != null && signatures != null) {
final List<Order> result = new ArrayList<>();
for (int i = 0; i < data.size(); i++) {
String originalJson = data.get(i);
result.add(new Order(GSON.fromJson(originalJson, Purchase.class), signatures.get(i), originalJson));
}
subscriber.onSuccess(result);
} else {
subscriber.onError(new NullPointerException((data == null) ? "data is null" : "signatures is null"));
}
} catch (BillingException e) {
subscriber.onError(e);
}
}).bindService()
);
}
}