Skip to content

Commit

Permalink
Merge pull request #7 from alessandrojp/feature/issue-6
Browse files Browse the repository at this point in the history
Add new attributes for subscriptions
  • Loading branch information
alessandrojp committed Sep 4, 2017
2 parents 033a74c + 59587fc commit 433056e
Show file tree
Hide file tree
Showing 10 changed files with 143 additions and 19 deletions.
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

0 comments on commit 433056e

Please sign in to comment.