In-app Billing Version 3

Size: px
Start display at page:

Download "In-app Billing Version 3"

Transcription

1 13

2 In-app Billing Version 3 Bruno Oliveira Developer Relations, Android 13

3 In-app billing! 2

4 In-app billing! Implement ALL the billing! 2

5 In-app billing! DO NOT WANT 2

6 PREVIOUSLY IN IN-APP BILLING 3

7 Easy

8 Easy mbillingservice.requestpurchase(msku, Consts.ITEM_TYPE_INAPP, mpayloadcontents)

9 Easy mbillingservice.requestpurchase(msku, Consts.ITEM_TYPE_INAPP, mpayloadcontents) public void onpurchasestatechange(purchasestate purchasestate, String itemid, int quantity, long purchasetime, String developerpayload) { if (Consts.DEBUG) { Log.i(TAG, "onpurchasestatechange() itemid: " + itemid + " " + purchasestate); } if (developerpayload == null) { logproductactivity(itemid, purchasestate.tostring()); } else { logproductactivity(itemid, purchasestate + "\n\t" + developerpayload); } if (purchasestate == PurchaseState.PURCHASED) { mowneditems.add(itemid); } // If this is a subscription, then enable the "Edit // Subscriptions" button. for (CatalogEntry e : CATALOG) { if (e.sku.equals(itemid) && e.managed.equals(managed.subscription)) { meditsubscriptionsbutton.setvisibility(view.visible); } } } mcatalogadapter.setowneditems(mowneditems); mowneditemscursor.requery();

10 * change. The signeddata parameter is a plaintext JSON string that is * signed by the server with the developer's private key. The signature * for the signed data is passed in the signature parameter. context the context Easy mbillingservice.requestpurchase(msku, Consts.ITEM_TYPE_INAPP, mpayloadcontents) signeddata the (unencrypted) JSON string signature the signature for the signeddata */ private void purchasestatechanged(context context, String signeddata, String signature) { Intent intent = new Intent(Consts.ACTION_PURCHASE_STATE_CHANGED); } public intent.setclass(context, void onpurchasestatechange(purchasestate BillingService.class); purchasestate, String itemid, intent.putextra(consts.inapp_signed_data, signeddata); intent.putextra(consts.inapp_signature, int quantity, long purchasetime, signature); String developerpayload) { context.startservice(intent); if (Consts.DEBUG) { Log.i(TAG, "onpurchasestatechange() itemid: " + itemid + " " + purchasestate); } /** * This is called when Android Market sends a "notify" message indicating that transaction * information is available. The request includes a nonce (random number used once) that if (developerpayload == null) { logproductactivity(itemid, purchasestate.tostring()); } else { logproductactivity(itemid, purchasestate + "\n\t" + developerpayload); } * we generate and Android Market signs and sends back to us with the purchase state and * other transaction details. This BroadcastReceiver cannot bind to the * MarketBillingService directly so it starts the {@link BillingService}, which does the * actual work of sending the message. * context the context notifyid the notification ID */ if (purchasestate == PurchaseState.PURCHASED) { mowneditems.add(itemid); private void notify(context context, String notifyid) { Intent intent = new Intent(Consts.ACTION_GET_PURCHASE_INFORMATION); intent.setclass(context, BillingService.class); intent.putextra(consts.notification_id, notifyid); } // If this is a subscription, then enable the "Edit // Subscriptions" button. for (CatalogEntry e : CATALOG) { if (e.sku.equals(itemid) && context.startservice(intent); /** * This is called when Android Market sends a server response code. The BillingService can * then report the status of the response if desired. * context the context requestid the request ID that corresponds to a previous request responsecodeindex the ResponseCode ordinal value for the request */ private void checkresponsecode(context context, long requestid, int responsecodeindex) { Intent intent = new Intent(Consts.ACTION_RESPONSE_CODE); intent.setclass(context, BillingService.class); } intent.putextra(consts.inapp_request_id, requestid); intent.putextra(consts.inapp_response_code, responsecodeindex); context.startservice(intent); } e.managed.equals(managed.subscription)) { meditsubscriptionsbutton.setvisibility(view.visible); } } } mcatalogadapter.setowneditems(mowneditems); mowneditemscursor.requery();

11 * change. The signeddata parameter is a plaintext JSON string that is * signed by the server with the developer's private key. The signature * for the signed data is passed in the signature parameter. context the context Easy mbillingservice.requestpurchase(msku, // the current request on the queue. bindtomarketbillingservice(); Consts.ITEM_TYPE_INAPP, return; mpayloadcontents) } signeddata the (unencrypted) JSON string signature the signature for the signeddata */ private void purchasestatechanged(context context, String signeddata, String signature) } { Intent intent = new Intent(Consts.ACTION_PURCHASE_STATE_CHANGED); // If we get here then all the requests ran successfully. If maxstartid // is not -1, then one of the requests started the service, so we can } public intent.setclass(context, void onpurchasestatechange(purchasestate BillingService.class); purchasestate, String itemid, intent.putextra(consts.inapp_signed_data, signeddata); intent.putextra(consts.inapp_signature, int quantity, long purchasetime, signature); String developerpayload) // stop { it now. context.startservice(intent); if (Consts.DEBUG) { if (maxstartid >= 0) { if (Consts.DEBUG) { Log.i(TAG, "onpurchasestatechange() itemid: " + itemid + " " + purchasestate); } } /** stopself(maxstartid); * This is called when Android Market sends a "notify" message indicating that transaction } * information if (developerpayload is available. The request == null) includes { a nonce (random number used } once) that * we generate and Android Market signs and sends back to us with the state and * other transaction logproductactivity(itemid, details. This BroadcastReceiver purchasestate.tostring()); cannot bind to the /** * MarketBillingService } else { directly so it starts the {@link BillingService}, which * This does is the called when we are connected to the MarketBillingService. * actual work logproductactivity(itemid, of sending the message. purchasestate + "\n\t" + * developerpayload); This runs in the main UI thread. * } context the context notifyid the notification ID */ if (purchasestate == PurchaseState.PURCHASED) { mowneditems.add(itemid); private void notify(context context, String notifyid) { Intent intent = new Intent(Consts.ACTION_GET_PURCHASE_INFORMATION); intent.setclass(context, BillingService.class); intent.putextra(consts.notification_id, notifyid); } // If this is a subscription, then enable the "Edit} // Subscriptions" button. for (CatalogEntry e : CATALOG) { if (e.sku.equals(itemid) && context.startservice(intent); maxstartid = request.getstartid(); } } else { // The service crashed, so restart it. Note that this leaves Log.i(TAG, "stopping service, startid: " + maxstartid); public void onserviceconnected(componentname name, IBinder service) { if (Consts.DEBUG) { Log.d(TAG, "Billing service connected"); } mservice = IMarketBillingService.Stub.asInterface(service); runpendingrequests(); /** * This is called when we are disconnected from the MarketBillingService. /** */ * This is called when Android Market sends a server response code. The BillingService can * then report the status of the response if desired. { public void onservicedisconnected(componentname name) { * meditsubscriptionsbutton.setvisibility(view.visible); Log.w(TAG, "Billing service disconnected"); context } the context mservice = null; requestid the request ID that corresponds to a previous request } responsecodeindex } the ResponseCode ordinal value for the request */ } /** private mcatalogadapter.setowneditems(mowneditems); void checkresponsecode(context context, long requestid, int responsecodeindex) * Unbinds from { the MarketBillingService. Call this when the application Intent intent = new Intent(Consts.ACTION_RESPONSE_CODE); * terminates to avoid leaking a ServiceConnection. intent.setclass(context, mowneditemscursor.requery(); BillingService.class); */ } public void unbind() { intent.putextra(consts.inapp_request_id, requestid); try { intent.putextra(consts.inapp_response_code, responsecodeindex); unbindservice(this); context.startservice(intent); } catch (IllegalArgumentException e) { } // This might happen if the service was disconnected

12 /** * change. The signeddata parameter is a plaintext JSON string that is maxstartid = request.getstartid(); * Returns a cursor that can be used to read all the rows and columns of * signed by the server with the developer's private key. The signature } * the "purchased items" table. } else { * for the */ signed data is passed in the signature parameter. context the context mbillingservice.requestpurchase(msku, // The service crashed, so restart it. Note that this leaves public Cursor queryallpurchaseditems() { // the current request on the queue. Easy signeddata return mdb.query(purchased_items_table_name, the (unencrypted) JSON string PURCHASED_COLUMNS, null, bindtomarketbillingservice(); signature null, the signature null, null, for Consts.ITEM_TYPE_INAPP, null); the signeddata return; mpayloadcontents) */ } } private void purchasestatechanged(context context, String signeddata, String signature) } { Intent /** intent = new Intent(Consts.ACTION_PURCHASE_STATE_CHANGED); // If we get here then all the requests ran successfully. If maxstartid // is not -1, then one of the requests started the service, so we can } public intent.setclass(context, * This void is onpurchasestatechange(purchasestate a standard BillingService.class); helper class for constructing the purchasestate, database. String itemid, intent.putextra(consts.inapp_signed_data, */ signeddata); intent.putextra(consts.inapp_signature, int quantity, long purchasetime, signature); String developerpayload) // stop { it now. private class DatabaseHelper extends SQLiteOpenHelper { context.startservice(intent); if (Consts.DEBUG) { if (maxstartid >= 0) { public DatabaseHelper(Context context) { if (Consts.DEBUG) { Log.i(TAG, super(context, "onpurchasestatechange() DATABASE_NAME, null, DATABASE_VERSION); itemid: " + itemid + " " + purchasestate); } } } Log.i(TAG, "stopping service, startid: " + maxstartid); /** stopself(maxstartid); * This is when Android Market sends a "notify" message indicating that transaction } * information if (developerpayload public is available. void oncreate(sqlitedatabase The request == null) includes { db) a { nonce (random number used } once) that * we generate and logproductactivity(itemid, createpurchasetable(db); Android Market signs and sends back to us with the state and * other transaction purchasestate.tostring()); } details. This BroadcastReceiver cannot bind to the /** * MarketBillingService } else { directly so it starts the {@link BillingService}, which * This does is the called when we are connected to the MarketBillingService. * actual logproductactivity(itemid, of sending the message. purchasestate + "\n\t" + * developerpayload); This runs in the main UI thread. * } public void onupgrade(sqlitedatabase db, int oldversion, int newversion) */ { context // the Production-quality context upgrade code should modify the tables notifyid the notification ID public void onserviceconnected(componentname name, IBinder service) { // the database version changes instead of dropping the tables and */ if (purchasestate == PurchaseState.PURCHASED) { if (Consts.DEBUG) { // re-creating them. private void notify(context context, String notifyid) { Log.d(TAG, "Billing service connected"); Intent intent mowneditems.add(itemid); (newversion!= DATABASE_VERSION) { = new Intent(Consts.ACTION_GET_PURCHASE_INFORMATION); } Log.w(TAG, "Database upgrade from old: " + oldversion + " to: intent.setclass(context, BillingService.class); mservice " + = IMarketBillingService.Stub.asInterface(service); newversion); intent.putextra(consts.notification_id, // If this is a subscription, notifyid); runpendingrequests(); db.execsql("drop TABLE IF EXISTS then " + PURCHASE_HISTORY_TABLE_NAME); enable the "Edit} context.startservice(intent); } // Subscriptions" db.execsql("drop button. TABLE IF EXISTS " + PURCHASED_ITEMS_TABLE_NAME); createpurchasetable(db); /** for (CatalogEntry return; e : CATALOG) { * This is called when we are disconnected from the MarketBillingService. /** } if (e.sku.equals(itemid) && */ * This is called } when Android Market sends a server response code. The BillingService can * then report the status of the response if desired. { public void onservicedisconnected(componentname name) { * private void meditsubscriptionsbutton.setvisibility(view.visible); createpurchasetable(sqlitedatabase db) { Log.w(TAG, "Billing service disconnected"); context db.execsql("create } the context TABLE " + PURCHASE_HISTORY_TABLE_NAME + "(" + mservice = null; requestid the request ID that corresponds to a previous request } responsecodeindex } HISTORY_ORDER_ID_COL + " TEXT PRIMARY KEY, " + HISTORY_STATE_COL the ResponseCode + " ordinal INTEGER, value " + for the request */ } /** HISTORY_PRODUCT_ID_COL + " TEXT, " + private mcatalogadapter.setowneditems(mowneditems); void checkresponsecode(context context, long requestid, int responsecodeindex) * Unbinds from { the MarketBillingService. Call this when the application HISTORY_DEVELOPER_PAYLOAD_COL + " TEXT, " + Intent intent = new Intent(Consts.ACTION_RESPONSE_CODE); * terminates to avoid leaking a ServiceConnection. intent.setclass(context, mowneditemscursor.requery(); HISTORY_PURCHASE_TIME_COL + " INTEGER)"); BillingService.class); */ db.execsql("create TABLE " + PURCHASED_ITEMS_TABLE_NAME + "(" } public + void unbind() { intent.putextra(consts.inapp_request_id, PURCHASED_PRODUCT_ID_COL requestid); + " TEXT PRIMARY KEY, " + try { intent.putextra(consts.inapp_response_code, PURCHASED_QUANTITY_COL + responsecodeindex); " INTEGER)"); unbindservice(this); context.startservice(intent); } } catch (IllegalArgumentException e) { } } // This might happen if the service was disconnected

13 /** * change. The signeddata parameter is a plaintext JSON string that is maxstartid = request.getstartid(); * Returns a cursor that can be used to read all the rows and columns of * signed by the server with the developer's private key. The signature } * the "purchased items" table. } else { * for the */ signed data is passed in the signature parameter. context the context mbillingservice.requestpurchase(msku, // The service crashed, so restart it. Note that this leaves public Cursor queryallpurchaseditems() { // the current request on the queue. Easy signeddata return mdb.query(purchased_items_table_name, the (unencrypted) JSON string PURCHASED_COLUMNS, null, bindtomarketbillingservice(); signature null, the signature null, null, for Consts.ITEM_TYPE_INAPP, null); the signeddata return; mpayloadcontents) */ } } private void purchasestatechanged(context context, String signeddata, String signature) } { Intent /** intent = new Intent(Consts.ACTION_PURCHASE_STATE_CHANGED); // If we get here then all the requests ran successfully. If maxstartid // is not -1, then one of the requests started the service, so we can } public intent.setclass(context, * This void is onpurchasestatechange(purchasestate a standard BillingService.class); helper class for constructing the purchasestate, database. String itemid, intent.putextra(consts.inapp_signed_data, */ signeddata); intent.putextra(consts.inapp_signature, int quantity, long purchasetime, signature); String developerpayload) // stop { it now. private class DatabaseHelper extends SQLiteOpenHelper { context.startservice(intent); if (Consts.DEBUG) { if (maxstartid >= 0) { public DatabaseHelper(Context context) { if (Consts.DEBUG) { Log.i(TAG, super(context, "onpurchasestatechange() DATABASE_NAME, null, DATABASE_VERSION); itemid: " + itemid + " " + purchasestate); } } } why does it get so } if (developerpayload public void oncreate(sqlitedatabase == null) { db) { } logproductactivity(itemid, createpurchasetable(db); purchasestate.tostring()); } /** } else logproductactivity(itemid, purchasestate + "\n\t" + * developerpayload); This runs in the main UI thread. } public void onupgrade(sqlitedatabase db, int oldversion, int newversion) */ { // Production-quality upgrade code should modify the tables // the database version if (purchasestate == PurchaseState.PURCHASED) complicated? changes instead of dropping the tables and { if (Consts.DEBUG) { // re-creating them. Log.d(TAG, "Billing service connected"); Intent intent mowneditems.add(itemid); if (newversion!= DATABASE_VERSION) { = new Intent(Consts.ACTION_GET_PURCHASE_INFORMATION); } Log.w(TAG, "Database upgrade from old: " + oldversion + " to: " + intent.setclass(context, newversion); BillingService.class); intent.putextra(consts.notification_id, // If this is a subscription, notifyid); runpendingrequests(); db.execsql("drop TABLE IF EXISTS then " + PURCHASE_HISTORY_TABLE_NAME); enable the "Edit} context.startservice(intent); // Subscriptions" db.execsql("drop button. TABLE IF EXISTS " + PURCHASED_ITEMS_TABLE_NAME); createpurchasetable(db); for (CatalogEntry return; e : CATALOG) { } if (e.sku.equals(itemid) && */ } { public void onservicedisconnected(componentname name) { private void meditsubscriptionsbutton.setvisibility(view.visible); createpurchasetable(sqlitedatabase db) { Log.w(TAG, "Billing service disconnected"); db.execsql("create } TABLE " + PURCHASE_HISTORY_TABLE_NAME + "(" + mservice = null; } } HISTORY_ORDER_ID_COL + " TEXT PRIMARY KEY, " + HISTORY_STATE_COL + " INTEGER, " + } /** HISTORY_PRODUCT_ID_COL + " TEXT, " + mcatalogadapter.setowneditems(mowneditems); HISTORY_DEVELOPER_PAYLOAD_COL + " TEXT, " + Intent intent = new Intent(Consts.ACTION_RESPONSE_CODE); * terminates to avoid leaking a ServiceConnection. intent.setclass(context, mowneditemscursor.requery(); HISTORY_PURCHASE_TIME_COL + " INTEGER)"); BillingService.class); */ db.execsql("create TABLE " + PURCHASED_ITEMS_TABLE_NAME + "(" } public + void unbind() { /** * This is called when Android Market sends a "notify" message indicating that transaction * information is available. The request includes a nonce (random number used once) that * we generate and Android Market signs and sends back to us with the purchase state and * other transaction details. This BroadcastReceiver cannot bind to the * MarketBillingService directly so it starts the {@link BillingService}, which * This does is the called when we are connected to the MarketBillingService. * actual work of sending the message. * context the context notifyid the notification ID public void onserviceconnected(componentname name, IBinder service) { */ private void notify(context context, String notifyid) { } intent.putextra(consts.inapp_request_id, PURCHASED_PRODUCT_ID_COL requestid); + " TEXT PRIMARY KEY, " + intent.putextra(consts.inapp_response_code, PURCHASED_QUANTITY_COL + responsecodeindex); " INTEGER)"); context.startservice(intent); } } } Log.i(TAG, "stopping service, startid: " + maxstartid); mservice = IMarketBillingService.Stub.asInterface(service); /** * This is called when we are disconnected from the MarketBillingService. /** * This is called when Android Market sends a server response code. The BillingService can * then report the status of the response if desired. * context the context requestid the request ID that corresponds to a previous request responsecodeindex the ResponseCode ordinal value for the request */ private void checkresponsecode(context context, long requestid, int responsecodeindex) * Unbinds from { the MarketBillingService. Call this when the application try { unbindservice(this); } catch (IllegalArgumentException e) { // This might happen if the service was disconnected

14

15 item

16 item your app

17 item

18 item receiver

19 item receiver your app

20 Billing V2 asynchronous Library Activity Service Broadcast Receiver Google Play 7

21 Billing V2 asynchronous Library Billing V3 Activity Service Broadcast Receiver Google Play 7

22 Billing V2 asynchronous Billing V3 Library Activity Service Broadcast Receiver Google Play 7

23 Billing V3 8

24 Billing V3 8

25 Billing V3 is synchronous Activity Google Play 9

26 Billing V3 is synchronous buy 50 gold coins Activity Google Play 9

27 Billing V3 is synchronous buy 50 gold coins Activity Google Play OK 9

28 In v2, restoring purchases was expensive My App 123 SD Card Folder John s Phone, Pay to the order of: Billing V Two for: restoring purchases CPU Cycles: Traffic: : : : : :: many lots x 10 ( ) MB ( ) GB ( ) TB John D. Veloper 10

29 In v3, Google Play maintains a client-side cache restore purchases Google Play servers Activity cache purchases so... 11

30 ...in v3, restoring purchases is pretty cheap CPU & NETWORK 99% OFF ON ANY GET-PURCHASES CALL W/ IN-APP BILLING VERSION 3 (THROUGH CLIENT-SIDE CACHING) AVAILABLE ON PARTICIPATING DEVICES. 12

31 ENOUGH SALES. SHOW ME THE CODE. 13

32 </sales> 14

33 Selling Stuff 15

34 Is V3 is supported? 16

35 public void onserviceconnected( ComponentName name, IBinder service) { } mservice = IInAppBillingService.Stub.asInterface(service); int response = mservice.isbillingsupported(3, getpackagename(), inapp ); if (response == BILLING_RESPONSE_RESULT_OK) { // has billing! } else { // no billing V3... } 16

36 public void onserviceconnected( ComponentName name, IBinder service) { } mservice = IInAppBillingService.Stub.asInterface(service); int response = mservice.isbillingsupported(3, getpackagename(), inapp ); if (response == BILLING_RESPONSE_RESULT_OK) { // has billing! } else { // no billing V3... } %+ of active devices 16

37 What does the user own? 17

38 Bundle bundle = mservice.getpurchases( 3, mcontext.getpackagename(), inapp ); cheap if (bundle.getint(response_code) == BILLING_RESPONSE_RESULT_OK) { ArrayList myskus, mypurchases, mysignatures; myskus = bundle.getstringarraylist(response_inapp_item_list); mypurchases bundle.getstringarraylist( RESPONSE_INAPP_PURCHASE_DATA_LIST); mysignatures = bundle.getstringarraylist( RESPONSE_INAPP_PURCHASE_SIGNATURE_LIST); } // handle items here synchronous! 17

39 18

40 18

41 $ 18

42 19

43 19

44 asdb rwfqf 19

45 REPLAY 20

46 REPLAY asdb rwfqf 20

47 REPLAY Probability that this user IS... asdb rwfqf thrilled an influential blogger 87% of all percentages in this slide may be made up. 20

48 unmanaged items managed items 21

49 Launch the purchase flow 22

50 Launch the purchase flow Bundle bundle = mservice.getbuyintent(3, "com.example.myapp", MY_SKU, inapp, developerpayload); PendingIntent pendingintent = bundle.getparcelable(response_buy_intent); if (bundle.getint(response_code) == BILLING_RESPONSE_RESULT_OK) { startintentsenderforresult(pendingintent, RC_BUY, new Intent(), Integer.valueOf(0), Integer.valueOf(0), Integer.valueOf(0)); } result comes back on onactivityresult() 22

51 23

52 onactivityresult() public void onactivityresult(int requestcode, int resultcode, Intent data) { if (requestcode == RC_BUY) { int responsecode = data.getintextra(response_code); String purchasedata = data.getstringextra( RESPONSE_INAPP_PURCHASE_DATA); String signature = data.getstringextra( RESPONSE_INAPP_SIGNATURE); //... 24

53 Purchase data { } orderid :..., packagename :..., productid :..., purchasetime :..., purchasestate :..., developerpayload,..., purchasetoken :... 25

54 hard to lose the purchase on startup: getpurchases() That s it... right? when user wants to purchase: getbuyintent(), launch the Intent. onactivityresult: handle purchase 26

55 27

56 x x - 27

57 28

58 x x - * not to scale. 28

59 A purchase is forever... [not] 29

60 A purchase is forever... [not] Premium upgrade 29

61 A purchase is forever... [not] Premium upgrade Ad-free 29

62 A purchase is forever... [not] Premium upgrade Ad-free Special items 29

63 A purchase is forever... [not] Premium upgrade Ad-free Special items Levels 29

64 So how do you implement: 30

65 So how do you implement: Health potions 30

66 So how do you implement: Health potions 50 coins 30

67 So how do you implement: Health potions 50 coins Season pass 30

68 Consumption 31

69 Consumable items? 32

70 Consumable items? Bruno s stuff 32

71 Consumable items? Bruno s stuff 1. Bruno buys COOL ITEM. 32

72 Consumable items? Bruno s stuff 1. Bruno buys COOL ITEM. COOL ITEM 32

73 Consumable items? Bruno s stuff 1. Bruno buys COOL ITEM. 2. What items does Bruno own? COOL ITEM 32

74 Consumable items? Bruno s stuff 1. Bruno buys COOL ITEM. 2. What items does Bruno own? { COOL ITEM } COOL ITEM 32

75 Consumable items? Bruno s stuff 1. Bruno buys COOL ITEM. 2. What items does Bruno own? { COOL ITEM } COOL ITEM 3. Bruno consumes COOL ITEM 32

76 Consumable items? Bruno s stuff 1. Bruno buys COOL ITEM. 2. What items does Bruno own? { COOL ITEM } 3. Bruno consumes COOL ITEM 32

77 Consumable items? Bruno s stuff 1. Bruno buys COOL ITEM. 2. What items does Bruno own? { COOL ITEM } 3. Bruno consumes COOL ITEM 4. What items does Bruno own? 32

78 Consumable items? Bruno s stuff 1. Bruno buys COOL ITEM. 2. What items does Bruno own? { COOL ITEM } 3. Bruno consumes COOL ITEM 4. What items does Bruno own? { } 32

79 Consumable items? Bundle b = mservice.consumepurchase( 3, // API version com.example.xyz, // package name token // purchase token ) 33

80 When should I consume? 34

81 When should I consume? Method 1 on item s actual usage Method 2 immediately upon purchase 34

82 Method 1: On actual usage 35

83 Method 1: On actual usage 35

84 Method 1: On actual usage Bruno s stuff 35

85 Method 1: On actual usage Bruno s stuff 35

86 Method 1: On actual usage Bruno s stuff POTION 35

87 Method 1: On actual usage Bruno s stuff POTION 35

88 Method 1: On actual usage Bruno s stuff POTION 35

89 Method 1: On actual usage Bruno s stuff 35

90 Limitations? I want a potion! POTION 36

91 Limitations? I want a potion! POTION 36

92 Limitations? I want a potion! I find your request illogical, user. POTION 36

93 Method 2: Consume upon purchase Bruno s stuff 37

94 Method 2: Consume upon purchase Bruno s stuff POTION 37

95 Method 2: Consume upon purchase Bruno s stuff 37

96 Method 2: Consume upon purchase Bruno s stuff POTION 37

97 Method 2: Consume upon purchase Bruno s stuff 37

98 Also: Method 2 immediately upon purchase 38

99 Also: Method 2 immediately upon purchase...and also on startup. IMPORTANT! 38

100 Method 2: Consume upon purchase and startup 39

101 Method 2: Consume upon purchase and startup Bruno s stuff POTION 39

102 Method 2: Consume upon purchase and startup Bruno s stuff 39

103 Summarizing on startup: getpurchases() if has potion, consume() onactivityresult: if purchase successful, consume() when user wants to purchase: getbuyintent(), launch the consume(): If consume successful, add potion to inventory. Intent. 40

104 Get product details 41

105 Query SKU details Bundle getskudetails( int apiversion, String packagename, String type, Bundle skusbundle ); 42

106 { productid : xyz123 type : inapp subs, price : $1.99 title : 100 coins description :... } 43

107 { productid : xyz123 type : inapp subs, price : $1.99 title : 100 coins description :... } Note: Price is for display not parsing! 43

108 Subscriptions 44

109 Are subscriptions supported? 45

110 public void onserviceconnected( ComponentName name, IBinder service) { } mservice = IInAppBillingService.Stub.asInterface(service); int response = mservice.isbillingsupported(3, getpackagename(), subs ); if (response == BILLING_RESPONSE_RESULT_OK) { // has V3 subscriptions! } else { // no V3 subscriptions... } 45

111 Launch the purchase flow (subscription) 46

112 Launch the purchase flow (subscription) Bundle bundle = mservice.getbuyintent(3, "com.example.myapp", MY_SKU, subs, developerpayload); PendingIntent pendingintent = bundle.getparcelable(response_buy_intent); if (bundle.getint(response_code) == BILLING_RESPONSE_RESULT_OK) { startintentsenderforresult(pendingintent, RC_BUY, new Intent(), Integer.valueOf(0), Integer.valueOf(0), Integer.valueOf(0)); } result comes back on onactivityresult() 46

113 Bundle b = mservice.consumepurchase( 3, // API version com.example.xyz, // package name token // purchase token ) A subscription can t be consumed. 47

114 Active Subcriptions? 48

115 Active Subcriptions? Bundle bundle = mservice.getpurchases( 3, mcontext.getpackagename(), ITEM_TYPE_SUBS); if (bundle.getint(response_code) == BILLING_RESPONSE_RESULT_OK) { } // same as before... 48

116 trial subscriptions active subscriptions expired subscriptions 49

117 trial subscriptions active subscriptions appear in getpurchases() expired subscriptions 49

118 trial subscriptions active subscriptions appear in getpurchases() expired subscriptions don t appear in getpurchases() 49

119 trial subscriptions active subscriptions appear in getpurchases() cancelled subscriptions * until end of paid billing period expired subscriptions don t appear in getpurchases() 49

120 Local cache? 50

121 Local cache? Google Play app Refresh: 24h (normally) 50

122 Careful with the UI thread! 51

123 This slide isn t responding. Careful with the UI thread! Do you want to close it? Wait OK 51

124 Safe for UI thread isbillingsupported getbuyintent 52

125 Safe for UI thread Don t call on UI thread isbillingsupported getbuyintent getpurchases consumepurchase getskudetails 52

126 Server side subscription API 53

127 Is it valid? subscription When does it expire? Will it auto-renew? subscription Cancel it. 54

128 { orderid :..., packagename :..., productid :..., purchasetime :..., purchasestate :..., developerpayload,..., purchasetoken :... } 55

129 GET androidpublisher/v1/applications/ {packagename}/subscriptions/{subscriptionid}/ purchases/{token} 56

130 { "kind": "androidpublisher#subscriptionpurchase", "initiationtimestampmsec":..., "validuntiltimestampmsec":..., "autorenewing":... } More at: 57

131 Security 58

132 59

133 59

134 Is this purchase legitimate? 59

135 Is this purchase legitimate? arrrrrr! of courrrse! 59

136 60

137 60

138 60

139 Risk Model 61

140 audience likelihood of piracy item value observed # of fake purchases Risk Model total legitimate technical purchases total purchases difficulty 61

141 Making life hard for pirates Your defenses: 1. developer payload 2. signature verification 3. server-side validation 62

142 Developer Payload Bruno s stuff POTION 63

143 Developer Payload Bruno s stuff belongs to Bruno POTION 63

144 Bruno 64

145 Bruno Onurb 64

146 Developer Payload ONURB s stuff 65

147 Developer Payload ONURB s stuff belongs to Bruno POTION 65

148 Signature Verification Your app has a public key Google Play signs purchases Always check signature! 66

149 Signature Verification PublicKey publickey =...; String signeddata =...; String signature =...; Signature sig = Signature.getInstance( SHA1withRSA ); sig.initverify(publickey); sig.update(signeddata.getbytes()); if (!sig.verify(base64.decode(signature))) { // failed! } return true; 67

150 Is client-side security enough? 68

151 Server-Side Validation check signature don t trust the client check order number valid? duplicate? secure the handshake 69

152 Summary MITM Purchase replay Framework compromise 70

153 Summary MITM Purchase replay Framework compromise Wishing really hard x x x 70

154 Summary MITM Purchase replay Framework compromise Wishing really hard x x x Client-side signature x x verification 70

155 Summary MITM Purchase replay Framework compromise Wishing really hard x x x Client-side signature x x verification + unique developer payload x 70

156 Summary MITM Purchase replay Framework compromise Wishing really hard x x x Client-side signature x x verification + unique developer payload x + Server-side verification 70

157 71

158 KEEP CALM AND USE BEST PRACTICES 71

159 KEEP developer payload CALM AND signature verification USE BEST PRACTICES server-side validation 71

160 Sandbox 72

161 Before Now (Sandbox) 73

162 Before Now (Sandbox) mock product mock purchase flow mock result 73

163 Before Now (Sandbox) mock product mock purchase flow mock result real product real credit card real purchase flow real charge 73

164 Before Now (Sandbox) mock product mock purchase flow mock result real product real credit card real purchase flow real product real credit card real result no charge real purchase flow real charge 73

165 purchase test accounts 74

166 75

167 75

168 Sample: TrivalDrive SDK manager code.google.com/p/ marketbilling 76

169 77

170 IAB v2 77

171 IAB v2 IAB v3 77

172 IAB v2 IAB v3 subscriptions 77

173 IAB v2 IAB v3 subscriptions consumption 77

174 IAB v2 IAB v3 subscriptions consumption product details 77

175 IAB v2 IAB v3 subscriptions server API consumption product details 77

176 IAB v2 IAB v3 subscriptions server API security consumption product details 77

177 IAB v2 IAB v3 subscriptions server API security consumption product details sandbox 77

178 78

179 developer experience 78

180 developer experience user experience 78

181

182 <Thank You!> plus.google.com/+brunooliveira Bruno Oliveira

183 Developers

SQLite Database. References. Overview. Structured Databases

SQLite Database. References. Overview. Structured Databases SQLite Database References Android Developers Article https://developer.android.com/training/basics/data-storage/databases.html Android SQLite Package Reference https://developer.android.com/reference/android/database/sqlite/package-summary.html

More information

An Android Studio SQLite Database Tutorial

An Android Studio SQLite Database Tutorial An Android Studio SQLite Database Tutorial Previous Table of Contents Next An Android Studio TableLayout and TableRow Tutorial Understanding Android Content Providers in Android Studio Purchase the fully

More information

Termite WiFi Direct API

Termite WiFi Direct API Termite WiFi Direct API Developers Guide 2014/15 Nuno Santos 1. Objectives This document provides a brief description of the Termite WiFi Direct API. 2. Termite API Guide In order for an application to

More information

EMBEDDED SYSTEMS PROGRAMMING Android Services

EMBEDDED SYSTEMS PROGRAMMING Android Services EMBEDDED SYSTEMS PROGRAMMING 2016-17 Android Services APP COMPONENTS Activity: a single screen with a user interface Broadcast receiver: responds to system-wide broadcast events. No user interface Service:

More information

Mobile Computing Practice # 2d Android Applications Local DB

Mobile Computing Practice # 2d Android Applications Local DB Mobile Computing Practice # 2d Android Applications Local DB In this installment we will add persistent storage to the restaurants application. For that, we will create a database with a table for holding

More information

Writing Efficient Drive Apps for Android. Claudio Cherubino / Alain Vongsouvanh Google Drive Developer Relations

Writing Efficient Drive Apps for Android. Claudio Cherubino / Alain Vongsouvanh Google Drive Developer Relations Writing Efficient Drive Apps for Android Claudio Cherubino / Alain Vongsouvanh Google Drive Developer Relations Raise your hand if you use Google Drive source: "put your hands up!" (CC-BY) Raise the other

More information

Use the API or contact customer service to provide us with the following: General ios Android App Name (friendly one-word name)

Use the API or contact customer service to provide us with the following: General ios Android App Name (friendly one-word name) Oplytic Attribution V 1.2.0 December 2017 Oplytic provides attribution for app-to-app and mobile-web-to-app mobile marketing. Oplytic leverages the tracking provided by Universal Links (ios) and App Links

More information

Database Development In Android Applications

Database Development In Android Applications ITU- FAO- DOA- TRCSL Training on Innovation & Application Development for E- Agriculture Database Development In Android Applications 11 th - 15 th December 2017 Peradeniya, Sri Lanka Shahryar Khan & Imran

More information

Services. service: A background task used by an app.

Services. service: A background task used by an app. CS 193A Services This document is copyright (C) Marty Stepp and Stanford Computer Science. Licensed under Creative Commons Attribution 2.5 License. All rights reserved. Services service: A background task

More information

Getting Started Guide. Version

Getting Started Guide. Version Getting Started Guide Version 1.15.0.0 2 Introduction Oculus Platform Copyrights and Trademarks 2017 Oculus VR, LLC. All Rights Reserved. OCULUS VR, OCULUS, and RIFT are trademarks of Oculus VR, LLC. (C)

More information

Frequently Asked Questions

Frequently Asked Questions Frequently Asked Questions Contents Getting Started 3 Backup & Sync 7 Using NeatCloud on the Web 9 Using NeatMobile 9 Using NeatVerify 10 Adding files to my NeatCloud 10 Searching my NeatCloud files and

More information

To receive money, just share your enrolled address or U.S. mobile phone number with a friend and ask them to send you money with Zelle.

To receive money, just share your enrolled  address or U.S. mobile phone number with a friend and ask them to send you money with Zelle. Consumer FAQs 1. What is Zelle? Zelle is a fast, safe and easy way to send money directly between almost any bank accounts in the U.S., typically within minutes 1. With just an email address or U.S. mobile

More information

Android. Broadcasts Services Notifications

Android. Broadcasts Services Notifications Android Broadcasts Services Notifications Broadcast receivers Application components that can receive intents from other applications Broadcast receivers must be declared in the manifest They have an associated

More information

07. Data Storage

07. Data Storage 07. Data Storage 22.03.2018 1 Agenda Data storage options How to store data in key-value pairs How to store structured data in a relational database 2 Data Storage Options Shared Preferences Store private

More information

Unity SDK for Xiaomi (IAP) Unity IAP provides an easy way to integrate Xiaomi IAP with Unity.

Unity SDK for Xiaomi (IAP) Unity IAP provides an easy way to integrate Xiaomi IAP with Unity. Unity SDK for Xiaomi (IAP) 1. Overview 2. Login & Purchase Flow 2.1 Stand-alone login & purchase 2.2 Online login & purchase 3. Technical Integration 3.1 Onboarding to Unity 3.2 Server side integration

More information

The app requires: Android 4.1 (Jelly Bean) or later Internet connection Bluetooth GPS

The app requires: Android 4.1 (Jelly Bean) or later Internet connection Bluetooth GPS FPV Tracker works with the Zbig & Pitlab FPV system. The application connects via Bluetooth to OSD or GroundStation. It extends features of the system. It is available on smartphones and tablets with Android.

More information

OFFLINE MODE OF ANDROID

OFFLINE MODE OF ANDROID OFFLINE MODE OF ANDROID APPS @Ajit5ingh ABOUT ME new Presenter( Ajit Singh, github.com/ajitsing, www.singhajit.com, @Ajit5ingh ) AGENDA Why offline mode? What it takes to build an offline mode Architecture

More information

The Basis of Data. Steven R. Bagley

The Basis of Data. Steven R. Bagley The Basis of Data Steven R. Bagley So far How to create a UI View defined in XML Java-based Activity as the Controller Services Long running processes Intents used to send messages between things asynchronously

More information

Android Services & Local IPC: Overview of Programming Bound Services

Android Services & Local IPC: Overview of Programming Bound Services : Overview of Programming Bound Services d.schmidt@vanderbilt.edu www.dre.vanderbilt.edu/~schmidt Professor of Computer Science Institute for Software Integrated Systems Vanderbilt University Nashville,

More information

FAQ for Autodesk A360 and its tiers A360 Team, A360 Drive and the Tech Preview

FAQ for Autodesk A360 and its tiers A360 Team, A360 Drive and the Tech Preview Autodesk A360 FAQ for Autodesk A360 and its tiers A360 Team, A360 Drive and the Tech Preview Table of contents 1. General product information 2 1.1 What is Autodesk A360? 2 1.2 What is Autodesk A360 Team?

More information

ON SCHEDULE TERMS AND CONDITIONS (September 23rd 2018)

ON SCHEDULE TERMS AND CONDITIONS (September 23rd 2018) By using On Schedule web application you are making an agreement with us, code fish, according to the current terms and conditions at the time of use. Upon the terms and conditions changing you will be

More information

Android About.me/DavidCorrado Mobile Meetup Organizer

Android About.me/DavidCorrado Mobile Meetup Organizer Android Tips/Tricks @DavidCorrado About.me/DavidCorrado Mobile Meetup Organizer IDE Don t Use Eclipse Use either Android Studio/IntelliJ They are basically the same thing. They are both built off of IntelliJ

More information

Networking & Internet

Networking & Internet In App Purchase Programming Guide Networking & Internet 2011-06-17 Apple Inc. 2011 Apple Inc. All rights reserved. exclusion may not apply to you. This warranty gives you specific legal rights, and you

More information

Vantiv ecommerce for Magento 2

Vantiv ecommerce for Magento 2 Vantiv ecommerce for Magento 2 User Guide Version 1.0.0 June 2017 Table of Content 1. Onboarding...3 2. Installation...3 3. Configuration...5 4. Nuances for each MOP...22 5. Checkout...23 6. Stored Payment

More information

Animation: Enter Vouchers by Item or Amount?

Animation: Enter Vouchers by Item or Amount? Creating Manual Vouchers Topic 1 Monday, May 23, 2011 Page 1: Animation: Enter Vouchers by Item or Amount? Teacher Narration: When your company has a non-inventory expense, such as a utility bill, a cleaning

More information

2. What is Google App Engine. Overview Google App Engine (GAE) is a Platform as a Service (PaaS) cloud computing platform for developing and hosting web applications in Google-managed data centers. Google

More information

Vantiv ecommerce for Magento 1 User Guide. Version 1.0.7

Vantiv ecommerce for Magento 1 User Guide. Version 1.0.7 Vantiv ecommerce for Magento 1 User Guide Version 1.0.7 Vantiv ecommerce for Magento 1... 1 User Guide... 1 1. Project... 3 2. Onboarding... 3 3. Installation... 3 4. Configuration... 5 5. Nuances for

More information

SAGE DISTRIBUTOR APPLICATION

SAGE DISTRIBUTOR APPLICATION SAGE DISTRIBUTOR APPLICATION Please email or fax in your application with your credit card information, or mail your application to us with a check. It usually takes approximately two business days for

More information

Global Phone (GlocalMe S1) Connect APP Quick Start Guide

Global Phone (GlocalMe S1) Connect APP Quick Start Guide Global Phone (GlocalMe S1) Connect APP Quick Start Guide Ver 1.5 Connect Please ensure your device is always with the latest firmware version for the best user experience. Applicable to Global Phone Service

More information

Samsung In App Purchase v2.0 Programming Guide

Samsung In App Purchase v2.0 Programming Guide Samsung In App Purchase v2.0 Programming Guide Revision History Version Description Author Date 1.0 Created 13.04.15 2.0.1 Security-related content added 13.06.04 2.0.2 Mode parameter added to getitemlist

More information

Services. Marco Ronchetti Università degli Studi di Trento

Services. Marco Ronchetti Università degli Studi di Trento 1 Services Marco Ronchetti Università degli Studi di Trento Service An application component that can perform longrunning operations in the background and does not provide a user interface. So, what s

More information

ANDROID CABBIE S MATE APP TROUBLESHOOTING AND PREVIOUSLY ASKED QUESTIONS: INDEX

ANDROID CABBIE S MATE APP TROUBLESHOOTING AND PREVIOUSLY ASKED QUESTIONS: INDEX ANDROID CABBIE S MATE APP TROUBLESHOOTING AND PREVIOUSLY ASKED QUESTIONS: This page was updated on 26 th March 2018 INDEX 1. I have a new device or I have reset my device and I am being prevented from

More information

Android Programming Lecture 7 9/23/2011

Android Programming Lecture 7 9/23/2011 Android Programming Lecture 7 9/23/2011 Multiple Activities So far, projects limited to one Activity Next step: Intra-application communication Having multiple activities within own application Inter-application

More information

RUNTIME PERMISSIONS IN ANDROID 6.0 Lecture 10a

RUNTIME PERMISSIONS IN ANDROID 6.0 Lecture 10a RUNTIME PERMISSIONS IN ANDROID 6.0 Lecture 10a COMPSCI 702 Security for Smart-Devices Muhammad Rizwan Asghar March 20, 2018 2 ANDROID 6.0 A version of the Android mobile operating system officially released

More information

Services are software components designed specifically to perform long background operations.

Services are software components designed specifically to perform long background operations. SERVICES Service Services are software components designed specifically to perform long background operations. such as downloading a file over an internet connection or streaming music to the user, but

More information

Amazon Instant Access Integration Guide. Subscriptions (SaaS)

Amazon Instant Access Integration Guide. Subscriptions (SaaS) Amazon Instant Access Integration Guide Subscriptions (SaaS) TABLE OF CONTENTS 1. INTRODUCTION... 3 2. SUBSCRIPTION PRODUCT OFFERINGS... 4 3. API OVERVIEW AND SPECIFICATIONS... 5 ACCOUNT LINKING ENDPOINT...

More information

Eng. Jaffer M. El-Agha Android Programing Discussion Islamic University of Gaza. Data persistence

Eng. Jaffer M. El-Agha Android Programing Discussion Islamic University of Gaza. Data persistence Eng. Jaffer M. El-Agha Android Programing Discussion Islamic University of Gaza Data persistence Shared preferences A method to store primitive data in android as key-value pairs, these saved data will

More information

Application / Document Management. MaaS360 e-learning Portal Course 3

Application / Document Management. MaaS360 e-learning Portal Course 3 Application / Document Management MaaS360 e-learning Portal Course 3 Agenda > Application Management Overview MaaS360 Workflows Device Workflows > Document Management Overview MaaS360 Workflows Document

More information

Sqlite Update Failed With Error Code 19 Android

Sqlite Update Failed With Error Code 19 Android Sqlite Update Failed With Error Code 19 Android i'm wrote simple DataBaseHelper to use SQlite in android. after create class as : static final int DATABASE_VERSION = 1, private SQLiteDatabase mdatabase,

More information

Adobe Document Cloud esign Services. for Salesforce Version 17 Installation and Customization Guide

Adobe Document Cloud esign Services. for Salesforce Version 17 Installation and Customization Guide Adobe Document Cloud esign Services for Salesforce Version 17 Installation and Customization Guide 2015 Adobe Systems Incorporated. All rights reserved. Last Updated: August 28, 2015 Table of Contents

More information

BlackBerry Developer Summit. A02: Rapid Development Leveraging BEMS Services and the AppKinetics Framework

BlackBerry Developer Summit. A02: Rapid Development Leveraging BEMS Services and the AppKinetics Framework BlackBerry Developer Summit A02: Rapid Development Leveraging BEMS Services and the AppKinetics Framework Page 2 of 21 Table of Contents 1. Workbook Scope... 4 2. Compatibility... 4 3. Source code download

More information

Symantec Backup Exec Blueprints

Symantec Backup Exec Blueprints Symantec Backup Exec Blueprints Blueprint for Optimized Duplication Backup Exec Technical Services Backup & Recovery Technical Education Services Symantec Backup Exec Blueprints - Optimized Duplication

More information

rat Comodo EDR Software Version 1.7 Administrator Guide Guide Version Comodo Security Solutions 1255 Broad Street Clifton, NJ 07013

rat Comodo EDR Software Version 1.7 Administrator Guide Guide Version Comodo Security Solutions 1255 Broad Street Clifton, NJ 07013 rat Comodo EDR Software Version 1.7 Administrator Guide Guide Version 1.1.120318 Comodo Security Solutions 1255 Broad Street Clifton, NJ 07013 Table of Contents 1 Introduction to Comodo EDR...3 1.1 Purchase

More information

AdVenture Capitalist Post-Mortem

AdVenture Capitalist Post-Mortem AdVenture Capitalist Post-Mortem (and please install AdVenture Capitalist) Back-end building blocks for your live game. Storage, compute, commerce, analytics and much, much more. Mission control for your

More information

N4A Device Manager 4.6.0

N4A Device Manager 4.6.0 N4ACMSX-UG460 N4A Device Manager 4.6.0 User Guide Version 1.0 October 30, 2015 NOVATEL WIRELESS COPYRIGHT STATEMENT 2015 Novatel Wireless, Inc. All rights reserved. The information contained in this document

More information

CleanMyPC User Guide

CleanMyPC User Guide CleanMyPC User Guide Copyright 2017 MacPaw Inc. All rights reserved. macpaw.com CONTENTS Overview 3 About CleanMyPC... 3 System requirements... 3 Download and installation 4 Activation and license reset

More information

Android Help. Section 8. Eric Xiao

Android Help. Section 8. Eric Xiao Android Help Section 8 Eric Xiao The Midterm That happened Any residual questions? New Assignment! Make a low-fi prototype Must be interactive Use balsamiq or paper Test it with users 3 tasks Test task

More information

Android Services & Local IPC: The Command Processor Pattern (Part 1)

Android Services & Local IPC: The Command Processor Pattern (Part 1) : The Command Processor Pattern (Part 1) d.schmidt@vanderbilt.edu www.dre.vanderbilt.edu/~schmidt Professor of Computer Science Institute for Software Integrated Systems Vanderbilt University Nashville,

More information

Message Passing & APIs

Message Passing & APIs CS 160 User Interface Design Message Passing & APIs Section 05 // September 25th, 2015 Tricia Fu // OH Monday 9:30-10:30am // triciasfu@berkeley.edu Agenda 1 Administrivia 2 Brainstorm Discussion 3 Message

More information

MercadoLibre Integration for Magento Guide

MercadoLibre Integration for Magento Guide by CedCommerce Products Documentation 1 / 33 1. Overview... 3 2. Configuration... 3 3. Profile Management... 10 3.1. Adding a Profile... 10 3.2. Editing a Profile... 15 3.3. Change the Status of Profile...

More information

Special Conditions and Service Description for amaysim Data Only

Special Conditions and Service Description for amaysim Data Only Special Conditions and Service Description for amaysim Data Only amaysim Australia Ltd, PO Box R567, Royal Exchange NSW 1225, Australia, ABN 65 143 613 478, ACN 143 613 478 Table of Contents 1. ABOUT THESE

More information

Unity SDK for Xiaomi (IAP) Unity IAP provides an easy way to integrate Xiaomi IAP with Unity.

Unity SDK for Xiaomi (IAP) Unity IAP provides an easy way to integrate Xiaomi IAP with Unity. Unity SDK for Xiaomi (IAP) 1. Overview 2. Login & Purchase Flow 2.1 Stand-alone login & purchase 2.2 Online login & purchase 3. Technical Integration 3.1 Onboarding to Unity 3.2 Server side integration

More information

Handbook: Carbonite Safe

Handbook: Carbonite Safe 1 Important Things to Know... 4 Carbonite Features... 5 Setting Up and Installing... 6 Starting a Trial... 7 Installing Carbonite for the First Time... 7 Buying a Subscription... 8 Subscription Pricing...

More information

VirtualSwindle: An Automated Attack Against In-App Billing on Android

VirtualSwindle: An Automated Attack Against In-App Billing on Android Northeastern University Systems Security Lab VirtualSwindle: An Automated Attack Against In-App Billing on Android ASIACCS 2014 Collin Mulliner, William Robertson, Engin Kirda {crm,wkr,ek}[at]ccs.neu.edu

More information

Overview What is Azure Multi-Factor Authentication? How it Works Get started Choose where to deploy MFA in the cloud MFA on-premises MFA for O365

Overview What is Azure Multi-Factor Authentication? How it Works Get started Choose where to deploy MFA in the cloud MFA on-premises MFA for O365 Table of Contents Overview What is Azure Multi-Factor Authentication? How it Works Get started Choose where to deploy MFA in the cloud MFA on-premises MFA for O365 users Security best practices How to

More information

Handbook: Carbonite Safe

Handbook: Carbonite Safe 1 Welcome to Carbonite! Important Things to Know...4 Carbonite Features...5 Setting Up and Installing...6 Starting a Trial... 7 Installing Carbonite for the First Time... 7 Buying a Subscription...9 Subscription

More information

SitelokTM. Stripe Plugin V1.5

SitelokTM. Stripe Plugin V1.5 SitelokTM Stripe Plugin V1.5 Sitelok Stripe Plugin Manual Copyright 2015-2018 Vibralogix. All rights reserved. This document is provided by Vibralogix for informational purposes only to licensed users

More information

Services. Background operating component without a visual interface Running in the background indefinitely

Services. Background operating component without a visual interface Running in the background indefinitely Services Background operating component without a visual interface Running in the background indefinitely Differently from Activity, Service in Android runs in background, they don t have an interface

More information

Cello How-To Guide. Package Management

Cello How-To Guide. Package Management Cello How-To Guide Package Management Contents 1 Package Management... 4 1.1 How to implement packages in cello... 4 1.2 Cello Package Structure... 4 1.3 How to Configure a Module... 5 1.4 How to Configure

More information

WardenCam User Manual Documentation

WardenCam User Manual Documentation WardenCam User Manual Documentation Release 1.0 WardenCam360 Sep 25, 2017 Contents 1 What is WardenCam? 3 2 Getting Started 5 2.1 Quick Installation Guide......................................... 5 2.2

More information

User Guide Mobile Point-of-Sale (mpos), Version 2.0

User Guide Mobile Point-of-Sale (mpos), Version 2.0 User Guide Mobile Point-of-Sale (mpos), Version 2.0 Contents Overview... 1 Features... 1 Getting Started... 2 Login... 3 First Time Login/Password Reset... 3 Setting Security Questions... 4 Password Expiring...

More information

Data Feeds Traffic Setup Instructions

Data Feeds Traffic Setup Instructions Data Feeds Traffic Setup Instructions In this document we ll first cover data feeds and traffic, then we ll cover actual setup. Data feeds are simple to find and simple to setup. They are also often less

More information

Publisher Onboarding Kit

Publisher Onboarding Kit Publisher Onboarding Kit Smart content. Smart business. Publishing, Supporting & Selling HotDocs Market Templates A HotDocs Market publisher s guide for loading templates, answering customer questions

More information

Services Broadcast Receivers Permissions

Services Broadcast Receivers Permissions Services Broadcast Receivers Permissions Runs in the background Extends Service Java class Not necessarily connected to the user s visual interface Music player working in foreground User wants read email

More information

Autodesk App Store Browser-based App Submission Process Overview

Autodesk App Store Browser-based App Submission Process Overview Autodesk App Store Browser-based App Submission Process Overview Please read through this information before and while submitting your first app to the Autodesk App store. It explains the basic workflow

More information

Wells Fargo Merchant Services. Wells Fargo Mobile Merchant User Guide for Apple ipad Version 3.2

Wells Fargo Merchant Services. Wells Fargo Mobile Merchant User Guide for Apple ipad Version 3.2 Wells Fargo Merchant Services Wells Fargo Mobile Merchant User Guide for Apple ipad Version 3.2 Table of Contents Overview...3 Key Features...3 Download Wells Fargo...4 Mobile Merchant...4 Demo Mode...4

More information

Software Practice 3 Today s lecture Today s Task

Software Practice 3 Today s lecture Today s Task 1 Software Practice 3 Today s lecture Today s Task Prof. Hwansoo Han T.A. Jeonghwan Park 43 2 MULTITHREAD IN ANDROID 3 Activity and Service before midterm after midterm 4 Java Thread Thread is an execution

More information

CIBC FirstCaribbean Mobile App. FREQUENTLY ASKED QUESTIONS (FAQs) Page 1 of 9

CIBC FirstCaribbean Mobile App. FREQUENTLY ASKED QUESTIONS (FAQs) Page 1 of 9 CIBC FirstCaribbean Mobile App FREQUENTLY ASKED QUESTIONS (FAQs) 1. What is the CIBC FirstCaribbean Mobile App? A: The CIBC FirstCaribbean Mobile App allows you to complete everyday banking functions on

More information

Produced by. Mobile Application Development. David Drohan Department of Computing & Mathematics Waterford Institute of Technology

Produced by. Mobile Application Development. David Drohan Department of Computing & Mathematics Waterford Institute of Technology Mobile Application Development Produced by David Drohan (ddrohan@wit.ie) Department of Computing & Mathematics Waterford Institute of Technology http://www.wit.ie Android & Firebase" Part 4 Firebase Integration

More information

Integration Service. Admin Console User Guide. On-Premises

Integration Service. Admin Console User Guide. On-Premises Kony Fabric Integration Service Admin Console User Guide On-Premises Release V8 SP1 Document Relevance and Accuracy This document is considered relevant to the Release stated on this title page and the

More information

Chapter 9: Key Management

Chapter 9: Key Management Chapter 9: Key Management Session and Interchange Keys Key Exchange Cryptographic Key Infrastructure Storing and Revoking Keys Digital Signatures Slide #9-1 Overview Key exchange Session vs. interchange

More information

Public-Key Infrastructure NETS E2008

Public-Key Infrastructure NETS E2008 Public-Key Infrastructure NETS E2008 Many slides from Vitaly Shmatikov, UT Austin slide 1 Authenticity of Public Keys? private key Alice Bob public key Problem: How does Alice know that the public key

More information

It s a Smart Phone World

It s a Smart Phone World It s a Smart Phone World Like most of us, you probably own and extensively use a smart phone. It is the access point that manages your calls, texts, email, business and social world. You take it everywhere

More information

Collector and Dealer Software - CAD 3.1

Collector and Dealer Software - CAD 3.1 Collector and Dealer Software - CAD 3.1 Your Registration Number Thank you for purchasing CAD! To ensure that you can receive proper support, we have already registered your copy with the serial number

More information

Department of Electrical Engineering and Computer Science MASSACHUSETTS INSTITUTE OF TECHNOLOGY Fall Quiz II

Department of Electrical Engineering and Computer Science MASSACHUSETTS INSTITUTE OF TECHNOLOGY Fall Quiz II Department of Electrical Engineering and Computer Science MASSACHUSETTS INSTITUTE OF TECHNOLOGY 6.858 Fall 2011 Quiz II You have 80 minutes to answer the questions in this quiz. In order to receive credit

More information

ZENworks Reporting ZENworks Reporting Universe Objects and Predefined Reports Reference. July 2017

ZENworks Reporting ZENworks Reporting Universe Objects and Predefined Reports Reference. July 2017 ZENworks Reporting 6.2.1 ZENworks Reporting Universe Objects and Predefined Reports Reference July 2017 Legal Notices For information about legal notices, trademarks, disclaimers, warranties, export and

More information

TERMS AND CONDITIONS FOR THE SAFARICOM PLATINUM SERVICE

TERMS AND CONDITIONS FOR THE SAFARICOM PLATINUM SERVICE TERMS AND CONDITIONS FOR THE SAFARICOM PLATINUM SERVICE The following Terms and Conditions apply to the Safaricom Platinum Plans Service ( the Service ) and by activating this Service, you will be deemed

More information

Windows 10 Professional for (Almost) Free. Add the Expert Features of Windows 10 Professional to Your Home System for Virtually Nothing

Windows 10 Professional for (Almost) Free. Add the Expert Features of Windows 10 Professional to Your Home System for Virtually Nothing Windows 10 Professional for (Almost) Free W 734/1 Add the Expert Features of Windows 10 Professional to Your Home System for Virtually Nothing Using the information given in this article you will be able

More information

Contents OVERVIEW... 3

Contents OVERVIEW... 3 Contents OVERVIEW... 3 Feature Summary... 3 CONFIGURATION... 4 System Requirements... 4 ConnectWise Manage Configuration... 4 Configuration of Manage Login... 4 Configuration of Integrator Login... 5 Option

More information

register/unregister for Intent to be activated if device is within a specific distance of of given lat/long

register/unregister for Intent to be activated if device is within a specific distance of of given lat/long stolen from: http://developer.android.com/guide/topics/sensors/index.html Locations and Maps Build using android.location package and google maps libraries Main component to talk to is LocationManager

More information

Server Management & Purchasing Guide

Server Management & Purchasing Guide USER GUIDE MADCAP CENTRAL Server Management & Purchasing Guide Copyright 2018 MadCap Software. All rights reserved. Information in this document is subject to change without notice. The software described

More information

worksmart!-mobile User Guide Version 3.5 worksmart!-mobile User Guide 1 Copyright 2005 Mobile Workforce, Inc.

worksmart!-mobile User Guide Version 3.5 worksmart!-mobile User Guide 1 Copyright 2005 Mobile Workforce, Inc. worksmart!-mobile User Guide 1 Copyright 2005 Mobile Workforce, Inc. Copyright Notice Mobile Workforce, Inc. has copyright ownership of the Mobile Workforce-workSmart! applications and other software related

More information

Frequently Asked Questions. Question # Page #

Frequently Asked Questions. Question # Page # Circles of Trust Frequently Asked Questions Question # Page # 1 What is Circles of Trust?... 2 2 Where can I get Circles of Trust?... 2 3 What is a.tef file?... 2 4 Someone sent me a.tef file. How do I

More information

D&B360. User Guide. for Microsoft Dynamics CRM. Version 2.3

D&B360. User Guide. for Microsoft Dynamics CRM. Version 2.3 D&B360 User Guide for Microsoft Dynamics CRM Version 2.3 D&B360 is a trademark or registered trademark of Dun and Bradstreet, Incorporated. Other trademarks used herein are the trademarks or registered

More information

App Development for Smart Devices. Lec #7: Windows Azure

App Development for Smart Devices. Lec #7: Windows Azure App Development for Smart Devices CS 495/595 - Fall 2011 Lec #7: Windows Azure Tamer Nadeem Dept. of Computer Science Objective Working in Background AsyncTask Cloud Computing Windows Azure Two Presentation

More information

Table of Contents: ipayment for Android

Table of Contents: ipayment for Android for Android Tablets Table of Contents: Two-Factor Authentication... 3 Card reader... 4 Bluetooth Card reader... 5 Receipt Printer... 6 Logging in to ipayment MobilePay... 7 Demo Mode... 7 Reset Password...

More information

Spring 2010: CS419 Computer Security

Spring 2010: CS419 Computer Security Spring 2010: CS419 Computer Security Vinod Ganapathy Lecture 7 Topic: Key exchange protocols Material: Class handout (lecture7_handout.pdf) Chapter 2 in Anderson's book. Today s agenda Key exchange basics

More information

CS378 -Mobile Computing. Services and Broadcast Receivers

CS378 -Mobile Computing. Services and Broadcast Receivers CS378 -Mobile Computing Services and Broadcast Receivers Services One of the four primary application components: activities content providers services broadcast receivers 2 Services Application component

More information

Android Programming Lecture 8: Activities, Odds & Ends, Two New Views 9/28/2011

Android Programming Lecture 8: Activities, Odds & Ends, Two New Views 9/28/2011 Android Programming Lecture 8: Activities, Odds & Ends, Two New Views 9/28/2011 Return Values from Activities: Callee Side How does the Sub-Activity send back a response? Create an Intent to return Stuff

More information

Installation guide Swisscom Mobile Security for Android Devices

Installation guide Swisscom Mobile Security for Android Devices Security for 1 Installation of Mobile Security...2 1.1 operating system devices with preinstalled Mobile Security program...2 1.2 operating system devices with preinstalled Swisscom Security Launcher...2

More information

APPLICATION ADMINISTRATOR GUIDE

APPLICATION ADMINISTRATOR GUIDE APPLICATION ADMINISTRATOR GUIDE BrightSign Network Enterprise Edition Version 4.2 BrightSign, LLC. 16780 Lark Ave., Suite B Los Gatos, CA 95032 408-852-9263 www.brightsign.biz TABLE OF CONTENTS Introduction

More information

Mobile Application Development Android

Mobile Application Development Android Mobile Application Development Android Lecture 3 MTAT.03.262 Satish Srirama satish.srirama@ut.ee Android Lecture 2 - recap Views and Layouts Events Basic application components Activities Intents 9/15/2014

More information

Ebay Integration User Guide 0.0.1

Ebay Integration User Guide 0.0.1 by CedCommerce Products User Guides 1 / 34 1. Ebay Integration for Magento 2 store Overview... 3 2. Ebay Integration for Magento 2 store extension Installation... 4 3. ebay Configuration Settings... 4

More information

What's New on Release 26.1

What's New on Release 26.1 What's New on Release 26.1 Welcome to Eagle Release 26.1 (server Level 38). This document summarizes the new features and enhancements. Use the red links below to take you to a particular section of this

More information

MadCap Central. Server Management & Purchasing Guide

MadCap Central. Server Management & Purchasing Guide MadCap Central Server Management & Purchasing Guide Copyright 2017 MadCap Software. All rights reserved. Information in this document is subject to change without notice. The software described in this

More information

MB Microsoft Dynamics CRM 2016 Online Deployment.

MB Microsoft Dynamics CRM 2016 Online Deployment. MB2-710 Microsoft Dynamics CRM 2016 Online Deployment Getting Started Overview CRM Online is a cloud-based offering of Microsoft Dynamics CRM The licensing is a subscription-based model with a monthly

More information

PLR-MRR-Products.com 1

PLR-MRR-Products.com 1 PLR-MRR-Products.com 1 You may give away this ebook. It may not be modified in any manner. Brought to You by PLR-MRR-Products.com Disclaimer Reasonable care has been taken to ensure that the information

More information

Sappi Ariba Network. Summit Guided Session: Account Configuration

Sappi Ariba Network. Summit Guided Session: Account Configuration Sappi Ariba Network Summit Guided Session: Account Configuration 1 Manage invitation letter + 2 Landing Page Sappi 2 1 1 Open the Invitation Letter that you received at your email address from ordersender-prod@ansmtp.ariba.com

More information

CS 167 Final Exam Solutions

CS 167 Final Exam Solutions CS 167 Final Exam Solutions Spring 2018 Do all questions. 1. [20%] This question concerns a system employing a single (single-core) processor running a Unix-like operating system, in which interrupts are

More information

How to Look Like a Healthy Borrower

How to Look Like a Healthy Borrower How to Look Like a Healthy Borrower Frequently Asked Questions February 2013 Table of Contents Overview 2 General Information 2 When is this webinar? 2 What is this webinar about? 2 What can I expect to

More information