diff --git a/.gitignore b/.gitignore index 0790958..4c2a140 100644 --- a/.gitignore +++ b/.gitignore @@ -103,3 +103,5 @@ release.properties graphenej/build local.properties + +sample diff --git a/gradle.properties b/gradle.properties index 5057963..59500a1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,8 +17,8 @@ # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true -VERSION_NAME=0.4.7-alpha1 -VERSION_CODE=10 +VERSION_NAME=0.4.7-alpha3 +VERSION_CODE=12 GROUP=com.github.bilthon POM_DESCRIPTION=A Java library for mobile app Developers; Graphene/Bitshares blockchain. diff --git a/graphenej/build.gradle b/graphenej/build.gradle index 04c2e30..8d86c09 100644 --- a/graphenej/build.gradle +++ b/graphenej/build.gradle @@ -1,5 +1,5 @@ group 'cy.agorise' -version '0.4.6' +version '0.4.7-alpha2' apply plugin: 'com.android.library' apply from: 'maven-push.gradle' @@ -21,8 +21,8 @@ android { defaultConfig { minSdkVersion 9 targetSdkVersion 24 - versionCode 10 - versionName "0.4.7-alpha1" + versionCode 12 + versionName "0.4.7-alpha3" vectorDrawables.useSupportLibrary = true } buildTypes { diff --git a/graphenej/src/main/AndroidManifest.xml b/graphenej/src/main/AndroidManifest.xml index 664deb6..7e71960 100644 --- a/graphenej/src/main/AndroidManifest.xml +++ b/graphenej/src/main/AndroidManifest.xml @@ -1,8 +1,6 @@ + package="cy.agorise.graphenej"> \ No newline at end of file diff --git a/graphenej/src/main/java/cy/agorise/graphenej/api/GetObjects.java b/graphenej/src/main/java/cy/agorise/graphenej/api/GetObjects.java index 23ead12..91d83be 100644 --- a/graphenej/src/main/java/cy/agorise/graphenej/api/GetObjects.java +++ b/graphenej/src/main/java/cy/agorise/graphenej/api/GetObjects.java @@ -5,12 +5,10 @@ import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonParser; -import com.google.gson.reflect.TypeToken; import com.neovisionaries.ws.client.WebSocket; import com.neovisionaries.ws.client.WebSocketFrame; import java.io.Serializable; -import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -93,6 +91,7 @@ public class GetObjects extends BaseGrapheneHandler { String response = frame.getPayloadText(); GsonBuilder gsonBuilder = new GsonBuilder(); + gsonBuilder.registerTypeAdapter(BitAssetData.class, new BitAssetData.BitAssetDataDeserializer()); gsonBuilder.registerTypeAdapter(AssetFeed.class, new AssetFeed.AssetFeedDeserializer()); gsonBuilder.registerTypeAdapter(ReportedAssetFeed.class, new ReportedAssetFeed.ReportedAssetFeedDeserializer()); gsonBuilder.registerTypeAdapter(AssetAmount.class, new AssetAmount.AssetAmountDeserializer()); @@ -106,7 +105,8 @@ public class GetObjects extends BaseGrapheneHandler { JsonParser parser = new JsonParser(); JsonArray resultArray = parser.parse(response).getAsJsonObject().get(WitnessResponse.KEY_RESULT).getAsJsonArray(); - for(JsonElement element : resultArray){ + for(int i = 0; i < resultArray.size(); i++){ + JsonElement element = resultArray.get(i); String id = element.getAsJsonObject().get(GrapheneObject.KEY_ID).getAsString(); GrapheneObject grapheneObject = new GrapheneObject(id); switch (grapheneObject.getObjectType()){ @@ -119,11 +119,9 @@ public class GetObjects extends BaseGrapheneHandler { parsedResult.add(account); break; case ASSET_BITASSET_DATA: - Type BitAssetDataType = new TypeToken>>(){}.getType(); - WitnessResponse> witnessResponse = gsonBuilder.create().fromJson(response, BitAssetDataType); - for(BitAssetData bitAssetData : witnessResponse.result){ - parsedResult.add(bitAssetData); - } + BitAssetData bitAssetData = gson.fromJson(element, BitAssetData.class); + parsedResult.add(bitAssetData); + break; } } diff --git a/graphenej/src/main/java/cy/agorise/graphenej/models/BitAssetData.java b/graphenej/src/main/java/cy/agorise/graphenej/models/BitAssetData.java index b8d6322..910a23b 100644 --- a/graphenej/src/main/java/cy/agorise/graphenej/models/BitAssetData.java +++ b/graphenej/src/main/java/cy/agorise/graphenej/models/BitAssetData.java @@ -1,7 +1,21 @@ package cy.agorise.graphenej.models; +import com.google.gson.JsonArray; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; + +import java.lang.reflect.Type; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; + import cy.agorise.graphenej.GrapheneObject; import cy.agorise.graphenej.Price; +import cy.agorise.graphenej.Util; /** * This is the representation of the response from the 'get_objects' call with @@ -9,16 +23,23 @@ import cy.agorise.graphenej.Price; * */ public class BitAssetData extends GrapheneObject { + public static final String KEY_FEEDS = "feeds"; public static final String KEY_CURRENT_FEED = "current_feed"; + public static final String KEY_CURRENT_FEED_PUBLICATION_TIME = "current_feed_publication_time"; + public static final String KEY_OPERATIONS = "operations"; + public static final String KEY_FORCE_SETTLED_VOLUME = "force_settled_volume"; + public static final String KEY_IS_PREDICTION_MARKET = "is_prediction_market"; + public static final String KEY_SETTLEMENT_PRICE = "settlement_price"; + public static final String KEY_SETTLEMENT_FUND = "settlement_fund"; - public ReportedAssetFeed[] feeds; - public AssetFeed current_feed; - public String current_feed_publication_time; - public Object options; - public long force_settled_volume; - public boolean is_prediction_market; - public Price settlement_price; - public long settlement_fund; + private ReportedAssetFeed[] feeds; + private AssetFeed current_feed; + private Date current_feed_publication_time; + private Options options; + private long force_settled_volume; + private boolean is_prediction_market; + private Price settlement_price; + private long settlement_fund; public BitAssetData(String id) { super(id); @@ -40,19 +61,24 @@ public class BitAssetData extends GrapheneObject { this.current_feed = current_feed; } - public String getCurrentFeedPublicationTime() { + public Date getCurrentFeedPublicationTime() { return current_feed_publication_time; } - public void setCurrentFeedPublicationTime(String current_feed_publication_time) { - this.current_feed_publication_time = current_feed_publication_time; + public void setCurrentFeedPublicationTime(String currentFeedPublicationTime) { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(Util.TIME_DATE_FORMAT); + try { + this.current_feed_publication_time = simpleDateFormat.parse(currentFeedPublicationTime); + } catch (ParseException e) { + e.printStackTrace(); + } } - public Object getOptions() { + public Options getOptions() { return options; } - public void setOptions(Object options) { + public void setOptions(Options options) { this.options = options; } @@ -87,4 +113,46 @@ public class BitAssetData extends GrapheneObject { public void setSettlementFund(long settlementFund) { this.settlement_fund = settlementFund; } + + /** + * Custom deserializer used to instantiate the BitAssetData class from the response of the + * 'get_objects' API call. + */ + public static class BitAssetDataDeserializer implements JsonDeserializer { + + @Override + public BitAssetData deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + JsonObject jsonObject = json.getAsJsonObject(); + String id = jsonObject.get(GrapheneObject.KEY_ID).getAsString(); + BitAssetData bitAssetData = new BitAssetData(id); + ArrayList reportedAssetFeeds = new ArrayList<>(); + + JsonArray jsonAssetFeeds = jsonObject.get(KEY_FEEDS).getAsJsonArray(); + for(JsonElement jsonFeed : jsonAssetFeeds){ + ReportedAssetFeed reportedAssetFeed = context.deserialize(jsonFeed, ReportedAssetFeed.class); + reportedAssetFeeds.add(reportedAssetFeed); + } + + // Deserializing attributes + JsonElement jsonCurrentFeed = jsonObject.get(KEY_CURRENT_FEED).getAsJsonObject(); + AssetFeed assetFeed = context.deserialize(jsonCurrentFeed, AssetFeed.class); + String publicationTime = jsonObject.get(KEY_CURRENT_FEED_PUBLICATION_TIME).getAsString(); + Options options = context.deserialize(jsonObject.get(KEY_OPERATIONS), Options.class); + long forceSettledVolume = jsonObject.get(KEY_FORCE_SETTLED_VOLUME).getAsLong(); + boolean isPredictionMarket = jsonObject.get(KEY_IS_PREDICTION_MARKET).getAsBoolean(); + Price settlementPrice = context.deserialize(jsonObject.get(KEY_SETTLEMENT_PRICE), Price.class); + long settlementFund = jsonObject.get(KEY_SETTLEMENT_FUND).getAsLong(); + + // Setting attributes + bitAssetData.setFeeds(reportedAssetFeeds.toArray(new ReportedAssetFeed[reportedAssetFeeds.size()])); + bitAssetData.setCurrentFeed(assetFeed); + bitAssetData.setCurrentFeedPublicationTime(publicationTime); + bitAssetData.setOptions(options); + bitAssetData.setForceSettledVolume(forceSettledVolume); + bitAssetData.setIsPredictionMarket(isPredictionMarket); + bitAssetData.setSettlementPrice(settlementPrice); + bitAssetData.setSettlementFund(settlementFund); + return bitAssetData; + } + } } diff --git a/graphenej/src/main/java/cy/agorise/graphenej/models/Options.java b/graphenej/src/main/java/cy/agorise/graphenej/models/Options.java new file mode 100644 index 0000000..e9ea3ea --- /dev/null +++ b/graphenej/src/main/java/cy/agorise/graphenej/models/Options.java @@ -0,0 +1,15 @@ +package cy.agorise.graphenej.models; + +/** + * Class used to represent the 'options' object returned inside the response obtained after + * querying for an object of type 'asset_bitasset_data' (2.4.x) + */ + +public class Options { + private long feed_lifetime_sec; + private long minimum_feeds; + private long force_settlement_delay_sec; + private long force_settlement_offset_percent; + private long maximum_force_settlement_volume; + private String short_backing_asset; +} diff --git a/graphenej/src/test/java/cy/agorise/graphenej/api/GetObjectsTest.java b/graphenej/src/test/java/cy/agorise/graphenej/api/GetObjectsTest.java index 4e5ae54..439c9d6 100644 --- a/graphenej/src/test/java/cy/agorise/graphenej/api/GetObjectsTest.java +++ b/graphenej/src/test/java/cy/agorise/graphenej/api/GetObjectsTest.java @@ -122,6 +122,7 @@ public class GetObjectsTest extends BaseApiTest{ public void onSuccess(WitnessResponse response) { System.out.println("onSuccess"); List list = (List) response.result; + System.out.println("Response array length: "+list.size()); BitAssetData bitAssetData1 = list.get(0); BitAssetData bitAssetData2 = list.get(1);