diff --git a/project.xml b/project.xml index 1558b16..b738f87 100644 --- a/project.xml +++ b/project.xml @@ -15,7 +15,7 @@ + - \ No newline at end of file diff --git a/src/IAPHandler.hx b/src/IAPHandler.hx index f27f49a..0f305ca 100644 --- a/src/IAPHandler.hx +++ b/src/IAPHandler.hx @@ -22,6 +22,7 @@ class IAPHandler public var requestReceiptsCall:Dynamic; public var getReceiptProductIDsCall:Dynamic; public var requestPurchaseCall:Dynamic; + public var getLastPurchasedProductIDCall:Dynamic; public var ouyaFacadeObject:Dynamic; public function new( ouyaFacadeObject:Dynamic, DERKeyPath:String ) @@ -44,6 +45,8 @@ class IAPHandler ("com.jarnik.iaptest.OUYA_IAP", "getReceiptProductIDs", "()Ljava/lang/String;", true); requestPurchaseCall = openfl.utils.JNI.createStaticMethod ("com.jarnik.iaptest.OUYA_IAP", "requestPurchase", "(Ljava/lang/String;)V", true); + getLastPurchasedProductIDCall = openfl.utils.JNI.createStaticMethod + ("com.jarnik.iaptest.OUYA_IAP", "getLastPurchasedProductID", "()Ljava/lang/String;", true); trace("=================== JNI methods linked!"); var appKey:ByteArray = Assets.getBytes( DERKeyPath ); @@ -73,14 +76,15 @@ class IAPHandler requestReceiptsCall( [] ); } - public function getProductListIDs():String { - // will return list of received product identifiers, delimited by space character - return getProductListIDsCall(); + // I don't know how to send any values from JNI back to Haxe, therefore I use the getters + public function getLastPurchasedProductID():String { + return getLastPurchasedProductIDCall(); } - - public function getReceiptProductIDs():String { - // will return list of purchased products identifiers, delimited by space character - return getReceiptProductIDsCall(); + public function getProductListIDs():Array { + return getProductListIDsCall().split(" "); + } + public function getReceiptProductIDs():Array { + return getReceiptProductIDsCall().split(" "); } // ==================================== CALLBACKS - OVERRIDE THESE! ======================= @@ -88,7 +92,7 @@ class IAPHandler // ==== Product List public function onProductListReceived() { - var p:Array = getProductListIDs().split(" "); + var p:Array = getProductListIDs(); trace("=== onProductListReceived! " + p.join(" ")); requestReceipts(); @@ -99,9 +103,9 @@ class IAPHandler } // ==== Purchasing - public function onPurchaseSuccess(productID:String) + public function onPurchaseSuccess() { - trace("=== onPurchaseSuccess! "+productID); + trace("=== onPurchaseSuccess! "+getLastPurchasedProductID()); } public function onPurchaseFailed(error:String) { @@ -115,7 +119,7 @@ class IAPHandler // ==== Receipt List public function onReceiptsReceived() { - var p:Array = getReceiptProductIDs().split(" "); + var p:Array = getReceiptProductIDs(); trace("=== onReceiptsReceived! "+p.join("x")); } public function onReceiptsFailed( error:String ) diff --git a/src/Main.hx b/src/Main.hx index d2a9c1c..64b9f76 100644 --- a/src/Main.hx +++ b/src/Main.hx @@ -24,6 +24,8 @@ class Main extends Sprite { #end private var handler:MyIAPHandler; + private var testProductPurchased:Bool; + private var icon:Bitmap; public function new () { @@ -34,6 +36,10 @@ class Main extends Sprite { super (); + testProductPurchased = false; + addChild( icon = new Bitmap( Assets.getBitmapData("assets/OUYA_O.png" ) ) ); + icon.visible = false; + #if android var getContext = JNI.createStaticMethod ("org.haxe.nme.GameActivity", "getContext", "()Landroid/content/Context;", true); OuyaController.init ( getContext () ); @@ -41,19 +47,35 @@ class Main extends Sprite { ouyaFacade.init( getContext(), OUYA_DEVELOPER_ID ); trace("OUYA controller & facade inited!"); - handler = new MyIAPHandler( ouyaFacade.__jobject, DER_KEY_PATH ); - handler.requestProductList(["test_sss_full", "__DECLINED__THIS_PURCHASE"]); + handler = new MyIAPHandler( ouyaFacade.__jobject, DER_KEY_PATH, receiptsReceived ); + handler.requestProductList([ + PRODUCT_IDENTIFIER + //, enter more product IDs here... + ]); - addChild( new Bitmap( Assets.getBitmapData("assets/OUYA_O.png" ) ) ); stage.addEventListener (JoystickEvent.BUTTON_DOWN, stage_onJoystickButtonDown); #end } #if android private function stage_onJoystickButtonDown( e:JoystickEvent ):Void { + if ( testProductPurchased ) + return; + trace("OUYA button pressed, starting purchase"); handler.requestPurchase( PRODUCT_IDENTIFIER ); } #end + private function receiptsReceived( products:Array ):Void { + trace("===== Main - Receipts received"); + icon.visible = true; + for ( p in products ) + if ( p == PRODUCT_IDENTIFIER ) { + trace("===== Main - product purchased"); + icon.visible = false; + testProductPurchased = true; + } + } + } \ No newline at end of file diff --git a/src/MyIAPHandler.hx b/src/MyIAPHandler.hx index 691f729..adc07e7 100644 --- a/src/MyIAPHandler.hx +++ b/src/MyIAPHandler.hx @@ -2,6 +2,24 @@ class MyIAPHandler extends IAPHandler { + private var receiptsReceivedCallback:Array->Void; + + public function new( ouyaFacadeObject:Dynamic, DERKeyPath:String, receiptsReceivedCallback:Array->Void ) + { + super( ouyaFacadeObject, DERKeyPath ); + this.receiptsReceivedCallback = receiptsReceivedCallback; + } + + override public function onPurchaseSuccess() + { + trace("=== onPurchaseSuccess! " + getLastPurchasedProductID()); + requestReceipts(); + } + + override public function onReceiptsReceived() + { + receiptsReceivedCallback( getReceiptProductIDs() ); + } } diff --git a/src/java/com/jarnik/iaptest/OUYA_IAP.java b/src/java/com/jarnik/iaptest/OUYA_IAP.java index e6413cf..2a64c36 100644 --- a/src/java/com/jarnik/iaptest/OUYA_IAP.java +++ b/src/java/com/jarnik/iaptest/OUYA_IAP.java @@ -43,6 +43,7 @@ public class OUYA_IAP public static List PRODUCT_IDENTIFIER_LIST; private static List mProductList; private static List mReceiptList; + private static String mLastPurchasedProductID; public static HaxeObject mCallback; private static OuyaFacade mOuyaFacade; @@ -160,6 +161,10 @@ public static void requestPurchase( String productName ) mOuyaFacade.requestPurchase(purchasable, new PurchaseListener(product)); } + public static String getLastPurchasedProductID() { + return mLastPurchasedProductID; + } + /** * The callback for when the user attempts to purchase something. We're not worried about * the user cancelling the purchase so we extend CancelIgnoringOuyaResponseListener, if @@ -243,7 +248,8 @@ public void onSuccess(String result) { return; } - mCallback.call("onPurchaseSuccess", new Object[] { mProduct.getIdentifier() } ); + mLastPurchasedProductID = mProduct.getIdentifier(); + mCallback.call("onPurchaseSuccess", new Object[] { } ); } @Override diff --git a/uploadOUYA.bat b/uploadOUYA.bat index da10770..abe594c 100644 --- a/uploadOUYA.bat +++ b/uploadOUYA.bat @@ -1 +1 @@ -adb install -r bin/android/bin/bin/ouya_iap-release.apk +adb install -r bin/android/bin/bin/ouya_iap-debug.apk