package yuku.easybilling;
import android.content.Context;
import android.os.Bundle;
import yuku.easybilling.BillingResult.CheckBillingSupportedResult;
import yuku.easybilling.BillingResult.ConfirmNotificationsResult;
import yuku.easybilling.BillingResult.GetPurchaseInformationResult;
import yuku.easybilling.BillingResult.RequestPurchaseResult;
import yuku.easybilling.BillingResult.RestoreTransactionsResult;
public abstract class BillingRequest {
public static final String TAG = BillingRequest.class.getSimpleName();
private final Context context;
public static class CheckBillingSupportedRequest extends BillingRequest {
public CheckBillingSupportedRequest(Context context) {
super(context);
}
@Override public Bundle getRequestBundle() {
Bundle res = makeRequestBundle("CHECK_BILLING_SUPPORTED");
return res;
}
@Override public CheckBillingSupportedResult parseResultBundle(Bundle resultBundle) {
CheckBillingSupportedResult res = new CheckBillingSupportedResult();
res.responseCode = getResponseCodeFromResultBundle(resultBundle);
return res;
}
}
public static class RequestPurchaseRequest extends BillingRequest {
private final String itemId;
private final String optionalDeveloperPayload;
public RequestPurchaseRequest(Context context, String itemId, String optionalDeveloperPayload) {
super(context);
this.itemId = itemId;
this.optionalDeveloperPayload = optionalDeveloperPayload;
}
@Override public Bundle getRequestBundle() {
Bundle res = makeRequestBundle("REQUEST_PURCHASE");
res.putString("ITEM_ID", itemId);
if (optionalDeveloperPayload != null) res.putString("DEVELOPER_PAYLOAD", optionalDeveloperPayload);
return res;
}
@Override public RequestPurchaseResult parseResultBundle(Bundle resultBundle) {
RequestPurchaseResult res = new RequestPurchaseResult();
res.responseCode = getResponseCodeFromResultBundle(resultBundle);
res.requestId = resultBundle.getLong("REQUEST_ID");
res.purchaseIntent = resultBundle.getParcelable("PURCHASE_INTENT");
return res;
}
}
public static class GetPurchaseInformationRequest extends BillingRequest {
private final long nonce;
private final String[] notifyIds;
public GetPurchaseInformationRequest(Context context, long nonce, String[] notifyIds) {
super(context);
this.nonce = nonce;
this.notifyIds = notifyIds;
}
// TODO fix android docs on type of notifyIds
@Override public Bundle getRequestBundle() {
Bundle res = makeRequestBundle("GET_PURCHASE_INFORMATION");
res.putLong("NONCE", nonce);
res.putStringArray("NOTIFY_IDS", notifyIds);
return res;
}
@Override public GetPurchaseInformationResult parseResultBundle(Bundle resultBundle) {
GetPurchaseInformationResult res = new GetPurchaseInformationResult();
res.responseCode = getResponseCodeFromResultBundle(resultBundle);
res.requestId = resultBundle.getLong("REQUEST_ID");
return res;
}
}
public static class ConfirmNotificationsRequest extends BillingRequest {
private final String[] notifyIds;
public ConfirmNotificationsRequest(Context context, String[] notifyIds) {
super(context);
this.notifyIds = notifyIds;
}
@Override public Bundle getRequestBundle() {
Bundle res = makeRequestBundle("CONFIRM_NOTIFICATIONS");
res.putStringArray("NOTIFY_IDS", notifyIds);
return res;
}
@Override public ConfirmNotificationsResult parseResultBundle(Bundle resultBundle) {
ConfirmNotificationsResult res = new ConfirmNotificationsResult();
res.responseCode = getResponseCodeFromResultBundle(resultBundle);
res.requestId = resultBundle.getLong("REQUEST_ID");
return res;
}
}
public static class RestoreTransactionsRequest extends BillingRequest {
private final long nonce;
public RestoreTransactionsRequest(Context context, long nonce) {
super(context);
this.nonce = nonce;
}
@Override public Bundle getRequestBundle() {
Bundle res = makeRequestBundle("RESTORE_TRANSACTIONS");
res.putLong("NONCE", nonce);
return res;
}
@Override public RestoreTransactionsResult parseResultBundle(Bundle resultBundle) {
RestoreTransactionsResult res = new RestoreTransactionsResult();
res.responseCode = getResponseCodeFromResultBundle(resultBundle);
res.requestId = resultBundle.getLong("REQUEST_ID");
return res;
}
}
public BillingRequest(Context context) {
this.context = context;
}
public abstract Bundle getRequestBundle();
public abstract <T extends BillingResult> BillingResult parseResultBundle(Bundle resultBundle);
protected Bundle makeRequestBundle(String method) {
Bundle request = new Bundle();
request.putString("BILLING_REQUEST", method);
request.putInt("API_VERSION", 1);
request.putString("PACKAGE_NAME", context.getPackageName());
return request;
}
public static ResponseCode getResponseCodeFromResultBundle(Bundle resultBundle) {
return ResponseCode.valueOf(resultBundle.getInt("RESPONSE_CODE", -1));
}
}