Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add new attributes for subscriptions #7

Merged
merged 4 commits into from
Sep 4, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -314,4 +314,10 @@ if (!isAvailable) {
public String getCurrency();
public String getPrice();
public long getPriceMicros();
public String getSubscriptionPeriod();
public String getFreeTrialPeriod();
public String getIntroductoryPrice();
public long getIntroductoryPriceAmountMicros();
public String getIntroductoryPricePeriod();
public int getIntroductoryPriceCycles();
```
9 changes: 9 additions & 0 deletions extension-rxjava/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# RxJava extension for Easy Checkout Library
[![Build Status](https://travis-ci.org/alessandrojp/easy-checkout.svg)](https://travis-ci.org/alessandrojp/easy-checkout)
[![Bintray](https://img.shields.io/bintray/v/alessandrojp/android/easy-checkout.svg)](https://bintray.com/alessandrojp/android/easy-checkout/view)
[![codecov](https://codecov.io/gh/alessandrojp/easy-checkout/branch/master/graph/badge.svg)](https://codecov.io/gh/alessandrojp/easy-checkout)
[![License](http://img.shields.io/:license-apache-brightgreen.svg)](http://www.apache.org/licenses/LICENSE-2.0.html)

### Why you should use Easy-Checkout?
Expand All @@ -18,6 +19,8 @@ It also solves common problems that developers face while working with In-App Bi
### Test coverage 100%
Easy-Checkout has 100% test coverage and I will try to keep it at that level for stable releases.

![coverage report](https://cloud.githubusercontent.com/assets/20607779/25327910/e6b6101c-2910-11e7-812e-b865886033d4.png)


### Installation
* For Eclipse users, download the latest jar version on [Bintray][] and add it as a dependency.
Expand Down Expand Up @@ -320,4 +323,10 @@ if (!isAvailable) {
public String getCurrency();
public String getPrice();
public long getPriceMicros();
public String getSubscriptionPeriod();
public String getFreeTrialPeriod();
public String getIntroductoryPrice();
public long getIntroductoryPriceAmountMicros();
public String getIntroductoryPricePeriod();
public int getIntroductoryPriceCycles();
```
2 changes: 1 addition & 1 deletion extension-rxjava/gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,5 @@
#
POM_ARTIFACT_ID=easy-checkout-extension-rxjava
POM_NAME=RxJava Extension
POM_DESCRIPTION=A RxJava extension for Easy Checkout Library
POM_DESCRIPTION=RxJava extension for Easy Checkout Library
POM_PACKAGING=aar
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
VERSION_NAME=v1.0.2
VERSION_NAME=v1.0.3
GROUP=jp.alessandro.android
POM_DEVELOPER_ID=alessandrojp
POM_DEVELOPER_NAME=Alessandro Yuichi Okimoto
Expand Down
2 changes: 1 addition & 1 deletion library/gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,6 @@
# Contact email: alessandro@alessandro.jp
#
POM_ARTIFACT_ID=easy-checkout
POM_DESCRIPTION=Fast and easy checkout library (Android In-App Billing) for Android apps with RxJava support.
POM_DESCRIPTION=In-App Billing for Android apps. It also supports RxJava. 100% Test coverage
POM_NAME=Easy Checkout Library (Android In-App Billing version 3 and 5)
POM_PACKAGING=aar
74 changes: 70 additions & 4 deletions library/src/main/java/jp/alessandro/android/iab/Item.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,27 @@ public class Item implements Parcelable {
private final String mCurrency;
private final String mPrice;
private final long mPriceMicros;

public Item(String originalJson, String sku, String type, String title,
String description, String currency, String price, long priceMicros) {
private final String mSubscriptionPeriod;
private final String mFreeTrialPeriod;
private final String mIntroductoryPrice;
private final long mIntroductoryPriceAmountMicros;
private final String mIntroductoryPricePeriod;
private final int mIntroductoryPriceCycles;

public Item(String originalJson,
String sku,
String type,
String title,
String description,
String currency,
String price,
long priceMicros,
String subscriptionPeriod,
String freeTrialPeriod,
String introductoryPrice,
long introductoryPriceAmountMicros,
String introductoryPricePeriod,
int introductoryPriceCycles) {
mOriginalJson = originalJson;
mSku = sku;
mType = type;
Expand All @@ -48,6 +66,12 @@ public Item(String originalJson, String sku, String type, String title,
mCurrency = currency;
mPrice = price;
mPriceMicros = priceMicros;
mSubscriptionPeriod = subscriptionPeriod;
mFreeTrialPeriod = freeTrialPeriod;
mIntroductoryPrice = introductoryPrice;
mIntroductoryPriceAmountMicros = introductoryPriceAmountMicros;
mIntroductoryPricePeriod = introductoryPricePeriod;
mIntroductoryPriceCycles = introductoryPriceCycles;
}

public static Item parseJson(String json) throws JSONException {
Expand All @@ -60,7 +84,13 @@ public static Item parseJson(String json) throws JSONException {
obj.optString("description"),
obj.optString("price_currency_code"),
obj.optString("price"),
obj.optLong("price_amount_micros")
obj.optLong("price_amount_micros"),
obj.optString("subscriptionPeriod"),
obj.optString("freeTrialPeriod"),
obj.optString("introductoryPricePeriod"),
obj.optLong("introductoryPriceAmountMicros"),
obj.optString("introductoryPricePeriod"),
obj.optInt("introductoryPriceCycles")
);
}

Expand All @@ -73,6 +103,12 @@ protected Item(Parcel in) {
mCurrency = in.readString();
mPrice = in.readString();
mPriceMicros = in.readLong();
mSubscriptionPeriod = in.readString();
mFreeTrialPeriod = in.readString();
mIntroductoryPrice = in.readString();
mIntroductoryPriceAmountMicros = in.readLong();
mIntroductoryPricePeriod = in.readString();
mIntroductoryPriceCycles = in.readInt();
}

@Override
Expand All @@ -90,6 +126,12 @@ public void writeToParcel(Parcel dest, int flags) {
dest.writeString(mCurrency);
dest.writeString(mPrice);
dest.writeLong(mPriceMicros);
dest.writeString(mSubscriptionPeriod);
dest.writeString(mFreeTrialPeriod);
dest.writeString(mIntroductoryPrice);
dest.writeLong(mIntroductoryPriceAmountMicros);
dest.writeString(mIntroductoryPricePeriod);
dest.writeInt(mIntroductoryPriceCycles);
}

public String getOriginalJson() {
Expand Down Expand Up @@ -124,6 +166,30 @@ public long getPriceMicros() {
return mPriceMicros;
}

public String getSubscriptionPeriod() {
return mSubscriptionPeriod;
}

public String getFreeTrialPeriod() {
return mFreeTrialPeriod;
}

public String getIntroductoryPrice() {
return mIntroductoryPrice;
}

public long getIntroductoryPriceAmountMicros() {
return mIntroductoryPriceAmountMicros;
}

public String getIntroductoryPricePeriod() {
return mIntroductoryPricePeriod;
}

public int getIntroductoryPriceCycles() {
return mIntroductoryPriceCycles;
}

public static final Creator<Item> CREATOR = new Creator<Item>() {
public Item createFromParcel(Parcel source) {
return new Item(source);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ private void getItemDetails(final PurchaseType type) throws InterruptedException
ArrayList<String> itemIds = new ArrayList<>();
itemIds.add(DataConverter.TEST_PRODUCT_ID);

ArrayList<String> items = mDataConverter.convertToSkuItemDetailsJsonArrayList(size);
ArrayList<String> items = mDataConverter.convertToSkuItemDetailsJsonArrayList(size, type);
Bundle responseBundle = new Bundle();
responseBundle.putLong(Constants.RESPONSE_CODE, 0L);
responseBundle.putStringArrayList(Constants.RESPONSE_DETAILS_LIST, items);
Expand All @@ -233,8 +233,7 @@ public void onSuccess(ItemDetails itemDetails) {

List<Item> purchaseList = itemDetails.getAll();
for (Item item : purchaseList) {
assertThat(itemDetails.hasItemId(item.getSku())).isTrue();
assertThat(itemDetails.getByItemId(item.getSku())).isNotNull();
checkGetItemDetailsCallback(itemDetails, item, type);
}
mProcessor.release();
latch.countDown();
Expand Down Expand Up @@ -283,4 +282,25 @@ public void onError(BillingException e) {

latch.await(15, TimeUnit.SECONDS);
}

private void checkGetItemDetailsCallback(ItemDetails itemDetails, Item item, PurchaseType type) {
assertThat(itemDetails.hasItemId(item.getSku())).isTrue();
assertThat(itemDetails.getByItemId(item.getSku())).isNotNull();

if (type == PurchaseType.IN_APP) {
assertThat(itemDetails.getByItemId(item.getSku()).getSubscriptionPeriod()).isEmpty();
assertThat(itemDetails.getByItemId(item.getSku()).getFreeTrialPeriod()).isEmpty();
assertThat(itemDetails.getByItemId(item.getSku()).getIntroductoryPrice()).isEmpty();
assertThat(itemDetails.getByItemId(item.getSku()).getIntroductoryPriceAmountMicros()).isZero();
assertThat(itemDetails.getByItemId(item.getSku()).getIntroductoryPricePeriod()).isEmpty();
assertThat(itemDetails.getByItemId(item.getSku()).getIntroductoryPriceCycles()).isZero();
} else {
assertThat(itemDetails.getByItemId(item.getSku()).getSubscriptionPeriod()).isNotEmpty();
assertThat(itemDetails.getByItemId(item.getSku()).getFreeTrialPeriod()).isNotEmpty();
assertThat(itemDetails.getByItemId(item.getSku()).getIntroductoryPrice()).isNotEmpty();
assertThat(itemDetails.getByItemId(item.getSku()).getIntroductoryPriceAmountMicros()).isNotZero();
assertThat(itemDetails.getByItemId(item.getSku()).getIntroductoryPricePeriod()).isNotEmpty();
assertThat(itemDetails.getByItemId(item.getSku()).getIntroductoryPriceCycles()).isNotZero();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ public void remoteException() throws RemoteException {
public void get20ItemDetails() throws RemoteException, BillingException {
int size = 20;
ArrayList<String> itemIds = mDataConverter.convertToItemIdArrayList(size);
ArrayList<String> items = mDataConverter.convertToSkuItemDetailsJsonArrayList(size);
ArrayList<String> items = mDataConverter.convertToSkuItemDetailsJsonArrayList(size, PurchaseType.IN_APP);
Bundle responseBundle = new Bundle();
responseBundle.putLong(Constants.RESPONSE_CODE, 0L);
responseBundle.putStringArrayList(Constants.RESPONSE_DETAILS_LIST, items);
Expand Down Expand Up @@ -141,7 +141,7 @@ public void get20ItemDetails() throws RemoteException, BillingException {
public void get70ItemDetails() throws RemoteException, BillingException {
int size = 70;
ArrayList<String> itemIds = mDataConverter.convertToItemIdArrayList(size);
ArrayList<String> items = mDataConverter.convertToSkuItemDetailsJsonArrayList(size);
ArrayList<String> items = mDataConverter.convertToSkuItemDetailsJsonArrayList(size, PurchaseType.IN_APP);
List<Bundle> splitBundleList = new ArrayList<>();

for (int i = 0; i < itemIds.size(); i += ItemGetter.MAX_SKU_PER_REQUEST) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public class ItemParcelableTest {

@Test
public void writeToParcel() throws JSONException {
Item item = Item.parseJson(String.format(Locale.ENGLISH, DataConverter.SKU_DETAIL_JSON, 0));
Item item = Item.parseJson(String.format(Locale.ENGLISH, DataConverter.SKU_SUBSCRIPTION_DETAILS_JSON, 0));

// Obtain a Parcel object and write the parcelable object to it
Parcel parcel = Parcel.obtain();
Expand All @@ -61,6 +61,12 @@ public void writeToParcel() throws JSONException {
assertThat(item.getCurrency()).isEqualTo(fromParcel.getCurrency());
assertThat(item.getPrice()).isEqualTo(fromParcel.getPrice());
assertThat(item.getPriceMicros()).isEqualTo(fromParcel.getPriceMicros());
assertThat(item.getSubscriptionPeriod()).isEqualTo(fromParcel.getSubscriptionPeriod());
assertThat(item.getFreeTrialPeriod()).isEqualTo(fromParcel.getFreeTrialPeriod());
assertThat(item.getIntroductoryPrice()).isEqualTo(fromParcel.getIntroductoryPrice());
assertThat(item.getIntroductoryPriceAmountMicros()).isEqualTo(fromParcel.getIntroductoryPriceAmountMicros());
assertThat(item.getIntroductoryPricePeriod()).isEqualTo(fromParcel.getIntroductoryPricePeriod());
assertThat(item.getIntroductoryPriceCycles()).isEqualTo(fromParcel.getIntroductoryPriceCycles());
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import jp.alessandro.android.iab.BillingApi;
import jp.alessandro.android.iab.BillingContext;
import jp.alessandro.android.iab.Constants;
import jp.alessandro.android.iab.PurchaseType;

/**
* Created by Alessandro Yuichi Okimoto on 2017/02/26.
Expand Down Expand Up @@ -76,15 +77,30 @@ public class DataConverter {

public static final String TEST_JSON_BROKEN = "{\"productId\":\"\"";

public static final String SKU_DETAIL_JSON = "{" +
public static final String SKU_DETAILS_JSON = "{" +
"\"productId\": \"" + TEST_PRODUCT_ID + "_%d\"," +
"\"type\": \"subs\"," +
"\"type\": \"inapp\"," +
"\"price\": \"¥1080\"," +
"\"price_amount_micros\": \"10800000\"," +
"\"price_currency_code\": \"JPY\"," +
"\"title\": \"Test Product\"," +
"\"description\": \"Fast and easy use Android In-App Billing\"}";

public static final String SKU_SUBSCRIPTION_DETAILS_JSON = "{" +
"\"productId\": \"" + TEST_PRODUCT_ID + "_%d\"," +
"\"type\": \"subs\"," +
"\"price\": \"¥1080\"," +
"\"price_amount_micros\": \"10800000\"," +
"\"price_currency_code\": \"JPY\"," +
"\"title\": \"Test Product\"," +
"\"description\": \"Fast and easy use Android In-App Billing\"," +
"\"subscriptionPeriod\": \"P1M\"," +
"\"freeTrialPeriod\": \"P7D\"," +
"\"introductoryPrice\": \"¥1080\"," +
"\"introductoryPriceAmountMicros\": \"10800000\"," +
"\"introductoryPricePeriod\": \"P1M\"," +
"\"introductoryPriceCycles\": 3}";

private final DataSigner mDataSigner;

private String mKeyFactoryAlgorithm;
Expand Down Expand Up @@ -204,20 +220,21 @@ public ArrayList<String> convertToPurchaseJsonBrokenArrayList() {
return data;
}

public ArrayList<String> convertToSkuItemDetailsJsonArrayList(int size) {
public ArrayList<String> convertToSkuItemDetailsJsonArrayList(int size, PurchaseType type) {
ArrayList<String> purchases = new ArrayList<>();
for (int i = 0; i < size; i++) {
String json = String.format(Locale.ENGLISH, SKU_DETAIL_JSON, i);
String targetSku = type == PurchaseType.IN_APP ? SKU_DETAILS_JSON : SKU_SUBSCRIPTION_DETAILS_JSON;
String json = String.format(Locale.ENGLISH, targetSku, i);
purchases.add(json);
}
return purchases;
}

public ArrayList<String> convertToSkuDetailsJsonBrokenArrayList() {
ArrayList<String> data = new ArrayList<>();
data.add(String.format(Locale.ENGLISH, SKU_DETAIL_JSON, 0));
data.add(String.format(Locale.ENGLISH, SKU_DETAILS_JSON, 0));
data.add(TEST_JSON_BROKEN);
data.add(String.format(Locale.ENGLISH, SKU_DETAIL_JSON, 2));
data.add(String.format(Locale.ENGLISH, SKU_DETAILS_JSON, 2));
return data;
}

Expand Down