Giter Club home page Giter Club logo

android-print-sdk's Introduction

Android Print SDK

Kite

The Kite Android Print SDK makes it easy to add print on demand functionality to your app.

Harness our worldwide print and distribution network. We'll take care of all the tricky printing and postage stuff for you!

To get started, you will need to have a free Kite developer account. Go to kite.ly to sign up for free.

Products

Use print to unlock hidden revenue streams and add value for your users. In under an hour you could be using our Android Print SDK to print:

  • Magnets
  • Polaroid Style Prints
  • Square Prints
  • Postcards
  • A4 (invoices, letters, etc)
  • New products being added monthly

Features

  • Print a wide variety of products on demand
  • Dynamic control over the pricing of products in you app pricing using our web Developer Dashboard
  • Revenue & order volume analytics available in the web dashboard
  • Review, refund or reprint any order within the web dashboard
  • Localized currency support
  • Worldwide address search & lookup
  • No server infrastructure required. We can handle everything for you from processing payments to printing & postage
  • Your branding not ours. You can create your own custom checkout & payment UI or customize ours

Requirements

  • Android API Level 16 - Android 4.1 (JELLY_BEAN)

Installation

Eclipse

See Installing the library - Eclipse

Android Studio / Gradle

We publish builds of our SDK to the Maven central repository as an .aar file. This file contains all of the classes, resources, and configurations that you'll need to use the library. To install the library inside Android Studio, you can simply declare it as dependecy in your build.gradle file.

dependencies {
    compile 'ly.kite:kite-print-sdk:5.+'
}

Once you've updated your build.gradle file, you can force Android Studio to sync with your new configuration by selecting Tools -> Android -> Sync Project with Gradle Files

This should download the aar dependency at which point you'll have access to the Kite Print SDK API calls. If it cannot find the dependency, you should make sure you've specified mavenCentral() as a repository in your build.gradle

Quick Integration

If you don't want to build your own shopping journey user experience you can integrate the SDK in a matter of minutes:

private final boolean PRODUCTION_RELEASE = false;

public void onLaunchSDKButtonClicked(View button) {
    ArrayList<Asset> assets = new ArrayList<>();
    try {
        assets.add(new Asset(new URL( "http://psps.s3.amazonaws.com/sdk_static/4.jpg" )));        
    } catch (MalformedURLException ex) {/* ignore */}
    
    if (PRODUCTION_RELEASE) {
        KiteSDK.getInstance(this, "<YOUR_LIVE_API_KEY>", KiteSDK.DefaultEnvironment.LIVE).startShopping(this, assets);
    } else {
        KiteSDK.getInstance(this, "<YOUR_TEST_API_KEY>", KiteSDK.DefaultEnvironment.TEST).startShopping(this, assets);
    }
}

The Asset class has several constructors not shown above so that you can launch the SDK with your images in a manner that fits your application. You can find your Kite Print API credentials under the Credentials section of the development dashboard.

Product Filtering

When launching the SDK, it is possible to limit the set of products (by supplying product ids) that you wish to offer to the user:

    ArrayList<Asset> assets = new ArrayList<>();

    try
      {
      assets.add(new Asset(new URL( "http://psps.s3.amazonaws.com/sdk_static/4.jpg" )));
      }
    catch (MalformedURLException ex) {/* Do something sensible */}

    KiteSDK.getInstance(this, "<YOUR_LIVE_API_KEY>", KiteSDK.DefaultEnvironment.LIVE).startShoppingForProducts( this, assets, "my_product_id" );

Launch to Product / Group

The SDK may be launched directly into a product group or product:

    KiteSDK.getInstance(this, "<YOUR_LIVE_API_KEY>", KiteSDK.DefaultEnvironment.LIVE).startShoppingForProductGroup( this, myAssets, "My Product Group Label" );

    KiteSDK.getInstance(this, "<YOUR_LIVE_API_KEY>", KiteSDK.DefaultEnvironment.LIVE).startShoppingForProductGroup( this, "My Product Group Label" );

    KiteSDK.getInstance(this, "<YOUR_LIVE_API_KEY>", KiteSDK.DefaultEnvironment.LIVE).startShoppingForProduct( this, myAssets, "my_product_id" );

    KiteSDK.getInstance(this, "<YOUR_LIVE_API_KEY>", KiteSDK.DefaultEnvironment.LIVE).startShoppingForProduct( this, "my_product_id" );

Custom Checkout

You can build your own UI if you don't want to use or customize the provided checkout and payment experience. You can still use the Kite Print SDK to handle the print order creation and submission:

  1. Create a print order representing the product(s) you wish to have printed and posted
  2. Set the shipping address to which the order will be delivered
  3. Take payment from the user for the order and submit it to our servers for printing and posting
  4. Register your payment details with us so that we can pay you when your users place orders

Credentials & Environments

Your mobile app integration requires different API Key values for each environment: Live and Test (Sandbox).

You can find your Kite Print API credentials under the Credentials section of the development dashboard.

Sandbox

Your Sandbox API Key can be used to submit test print orders to our servers. These orders will not be printed and posted but will allow you to integrate the Print SDK into your app without incurring cost. During development and testing you'll primarily want to be using the sandbox environment to avoid moving real money around.

When you're ready to test the end to end printing and postage process; and before you submit your app to the App Store, you'll need to swap in your live API key.

Live

Your Live API Key is used to submit print orders to our servers that will be printed and posted to the recipient specified. Live orders cost real money. This cost typically passed on to your end user (although this doesn't have to be the case if you want to cover it yourself).

Logging in to our Developer Dashboard allow's you to dynamically change the end user price i.e. the revenue you want to make on every order. Payment in several currencies is supported so that you can easily localize prices for your users. The dashboard also provides an overview of print order volume and the money you're making.

Documentation

  • These docs in the SDK, which include an overview of usage, step-by-step integration instructions, and sample code
  • The sample app included in this SDK
  • Source files are thoroughly documented; refer to them as needed for extra details about any given class or parameter
  • The Kite Print API & SDK Developer Docs, which cover error codes and optional server-side integration instructions

Push Notifications

Push notifications are a powerful marketing tool that if used effectively can increase both user engagement and customer life time value by driving more sales within your application.

A guide to configuring push notifications in your app can be found here.

Open Source Acknowledgements

The Android Print SDK uses software created by the Open Source community, you can find a full list of acknowledgements here.

License

Kite Android Print SDK is available under a modified MIT license. See the LICENSE file for more info.

android-print-sdk's People

Contributors

alibros avatar andreimacaveiu avatar dbotha avatar fumin avatar sarahcyates avatar scsharp avatar th0br0 avatar timatoe avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

android-print-sdk's Issues

Crash during checkout (from Crashlytics)

Crashlytics output:

Crashlytics - plaintext stacktrace downloaded by Uri at Wed, 03 Aug 2016 07:33:32 GMT

Platform: android

Version: 1.4 (17)

Issue #: 430

Date: 2016-08-03T07:22:31Z

OS Version: 6.0.1

Device: SM-G935F

RAM Free: 23.9%

Disk Free: 33.5%

#0. Crashed: main: 0 0 0x0000000000000000

   at ly.kite.checkout.ShippingActivity.onForwardsButtonClicked(ShippingActivity.java:384)
   at ly.kite.checkout.ShippingActivity.onClick(ShippingActivity.java:303)
   at android.view.View.performClick(View.java:5697)
   at android.widget.TextView.performClick(TextView.java:10814)
   at android.view.View$PerformClick.run(View.java:22526)
   at android.os.Handler.handleCallback(Handler.java:739)
   at android.os.Handler.dispatchMessage(Handler.java:95)
   at android.os.Looper.loop(Looper.java:158)
   at android.app.ActivityThread.main(ActivityThread.java:7229)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
at ly.kite.checkout.ShippingActivity.onForwardsButtonClicked(ShippingActivity.java:384)
at ly.kite.checkout.ShippingActivity.onClick(ShippingActivity.java:303)
at android.view.View.performClick(View.java:5697)
at android.widget.TextView.performClick(TextView.java:10814)
at android.view.View$PerformClick.run(View.java:22526)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7229)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
#0. Crashed: main: 0 0 0x0000000000000000

   at ly.kite.checkout.ShippingActivity.onForwardsButtonClicked(ShippingActivity.java:384)
   at ly.kite.checkout.ShippingActivity.onClick(ShippingActivity.java:303)
   at android.view.View.performClick(View.java:5697)
   at android.widget.TextView.performClick(TextView.java:10814)
   at android.view.View$PerformClick.run(View.java:22526)
   at android.os.Handler.handleCallback(Handler.java:739)
   at android.os.Handler.dispatchMessage(Handler.java:95)
   at android.os.Looper.loop(Looper.java:158)
   at android.app.ActivityThread.main(ActivityThread.java:7229)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

#1. Queue

   at java.lang.Object.wait(Object.java)
   at java.lang.Thread.parkFor$(Thread.java:1220)
   at sun.misc.Unsafe.park(Unsafe.java:299)
   at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
   at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2013)
   at java.util.concurrent.PriorityBlockingQueue.take(PriorityBlockingQueue.java:510)
   at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.performOperation(DependencyPriorityBlockingQueue.java:197)
   at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.get(DependencyPriorityBlockingQueue.java:236)
   at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take(DependencyPriorityBlockingQueue.java:65)
   at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take(DependencyPriorityBlockingQueue.java:46)
   at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1036)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1098)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
   at java.lang.Thread.run(Thread.java:818)

#2. Queue

   at java.lang.Object.wait(Object.java)
   at java.lang.Thread.parkFor$(Thread.java:1220)
   at sun.misc.Unsafe.park(Unsafe.java:299)
   at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
   at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2013)
   at java.util.concurrent.PriorityBlockingQueue.take(PriorityBlockingQueue.java:510)
   at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.performOperation(DependencyPriorityBlockingQueue.java:197)
   at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.get(DependencyPriorityBlockingQueue.java:236)
   at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take(DependencyPriorityBlockingQueue.java:65)
   at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take(DependencyPriorityBlockingQueue.java:46)
   at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1036)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1098)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
   at java.lang.Thread.run(Thread.java:818)

#3. AsyncTask #8

   at java.lang.Object.wait(Object.java)
   at java.lang.Thread.parkFor$(Thread.java:1220)
   at sun.misc.Unsafe.park(Unsafe.java:299)
   at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
   at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2013)
   at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:410)
   at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1036)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1098)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
   at java.lang.Thread.run(Thread.java:818)

#4. Queue

   at java.lang.Object.wait(Object.java)
   at java.lang.Thread.parkFor$(Thread.java:1220)
   at sun.misc.Unsafe.park(Unsafe.java:299)
   at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
   at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2013)
   at java.util.concurrent.PriorityBlockingQueue.take(PriorityBlockingQueue.java:510)
   at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.performOperation(DependencyPriorityBlockingQueue.java:197)
   at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.get(DependencyPriorityBlockingQueue.java:236)
   at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take(DependencyPriorityBlockingQueue.java:65)
   at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take(DependencyPriorityBlockingQueue.java:46)
   at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1036)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1098)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
   at java.lang.Thread.run(Thread.java:818)

#5. AsyncTask #6

   at java.lang.Object.wait(Object.java)
   at java.lang.Thread.parkFor$(Thread.java:1220)
   at sun.misc.Unsafe.park(Unsafe.java:299)
   at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
   at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2013)
   at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:410)
   at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1036)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1098)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
   at java.lang.Thread.run(Thread.java:818)

#6. FinalizerWatchdogDaemon

   at java.lang.Object.wait(Object.java)
   at java.lang.Daemons$FinalizerWatchdogDaemon.waitForObject(Daemons.java:270)
   at java.lang.Daemons$FinalizerWatchdogDaemon.run(Daemons.java:242)
   at java.lang.Thread.run(Thread.java:818)

#7. AsyncTask #1

   at java.lang.Object.wait(Object.java)
   at java.lang.Thread.parkFor$(Thread.java:1220)
   at sun.misc.Unsafe.park(Unsafe.java:299)
   at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
   at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2013)
   at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:410)
   at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1036)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1098)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
   at java.lang.Thread.run(Thread.java:818)

#8. OkHttp ConnectionPool

   at java.lang.Object.wait(Object.java)
   at com.android.okhttp.ConnectionPool.performCleanup(ConnectionPool.java:319)
   at com.android.okhttp.ConnectionPool.runCleanupUntilPoolIsEmpty(ConnectionPool.java:256)
   at com.android.okhttp.ConnectionPool.access$000(ConnectionPool.java:59)
   at com.android.okhttp.ConnectionPool$1.run(ConnectionPool.java:102)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
   at java.lang.Thread.run(Thread.java:818)

#9. main

   at java.lang.Object.wait(Object.java)
   at java.lang.Thread.parkFor$(Thread.java:1220)
   at sun.misc.Unsafe.park(Unsafe.java:299)
   at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:198)
   at java.util.concurrent.FutureTask.awaitDone(FutureTask.java:418)
   at java.util.concurrent.FutureTask.get(FutureTask.java:175)
   at com.crashlytics.android.core.CrashlyticsExecutorServiceWrapper.executeSyncLoggingException(CrashlyticsExecutorServiceWrapper.java:44)
   at com.crashlytics.android.core.CrashlyticsUncaughtExceptionHandler.uncaughtException(CrashlyticsUncaughtExceptionHandler.java:235)
   at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693)
   at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)

#10. Queue

   at java.lang.Object.wait(Object.java)
   at java.lang.Thread.parkFor$(Thread.java:1220)
   at sun.misc.Unsafe.park(Unsafe.java:299)
   at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
   at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2013)
   at java.util.concurrent.PriorityBlockingQueue.take(PriorityBlockingQueue.java:510)
   at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.performOperation(DependencyPriorityBlockingQueue.java:197)
   at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.get(DependencyPriorityBlockingQueue.java:236)
   at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take(DependencyPriorityBlockingQueue.java:65)
   at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take(DependencyPriorityBlockingQueue.java:46)
   at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1036)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1098)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
   at java.lang.Thread.run(Thread.java:818)

#11. pool-5-thread-1

   at java.lang.Object.wait(Object.java)
   at java.lang.Thread.parkFor$(Thread.java:1220)
   at sun.misc.Unsafe.park(Unsafe.java:299)
   at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
   at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2013)
   at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:410)
   at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1036)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1098)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
   at java.lang.Thread.run(Thread.java:818)

#12. AsyncTask #9

   at java.lang.Object.wait(Object.java)
   at java.lang.Thread.parkFor$(Thread.java:1220)
   at sun.misc.Unsafe.park(Unsafe.java:299)
   at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
   at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2013)
   at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:410)
   at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1036)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1098)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
   at java.lang.Thread.run(Thread.java:818)

#13. Queue

   at java.lang.Object.wait(Object.java)
   at java.lang.Thread.parkFor$(Thread.java:1220)
   at sun.misc.Unsafe.park(Unsafe.java:299)
   at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
   at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2013)
   at java.util.concurrent.PriorityBlockingQueue.take(PriorityBlockingQueue.java:510)
   at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.performOperation(DependencyPriorityBlockingQueue.java:197)
   at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.get(DependencyPriorityBlockingQueue.java:236)
   at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take(DependencyPriorityBlockingQueue.java:65)
   at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take(DependencyPriorityBlockingQueue.java:46)
   at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1036)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1098)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
   at java.lang.Thread.run(Thread.java:818)

#14. pool-5-thread-3

   at java.lang.Object.wait(Object.java)
   at java.lang.Thread.parkFor$(Thread.java:1220)
   at sun.misc.Unsafe.park(Unsafe.java:299)
   at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
   at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2013)
   at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:410)
   at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1036)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1098)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
   at java.lang.Thread.run(Thread.java:818)

#15. Queue

   at java.lang.Object.wait(Object.java)
   at java.lang.Thread.parkFor$(Thread.java:1220)
   at sun.misc.Unsafe.park(Unsafe.java:299)
   at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
   at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2013)
   at java.util.concurrent.PriorityBlockingQueue.take(PriorityBlockingQueue.java:510)
   at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.performOperation(DependencyPriorityBlockingQueue.java:197)
   at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.get(DependencyPriorityBlockingQueue.java:236)
   at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take(DependencyPriorityBlockingQueue.java:65)
   at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take(DependencyPriorityBlockingQueue.java:46)
   at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1036)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1098)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
   at java.lang.Thread.run(Thread.java:818)

#16. Queue

   at java.lang.Object.wait(Object.java)
   at java.lang.Thread.parkFor$(Thread.java:1220)
   at sun.misc.Unsafe.park(Unsafe.java:299)
   at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
   at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2013)
   at java.util.concurrent.PriorityBlockingQueue.take(PriorityBlockingQueue.java:510)
   at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.performOperation(DependencyPriorityBlockingQueue.java:197)
   at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.get(DependencyPriorityBlockingQueue.java:236)
   at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take(DependencyPriorityBlockingQueue.java:65)
   at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take(DependencyPriorityBlockingQueue.java:46)
   at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1036)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1098)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
   at java.lang.Thread.run(Thread.java:818)

#17. AsyncTask #2

   at java.lang.Object.wait(Object.java)
   at java.lang.Thread.parkFor$(Thread.java:1220)
   at sun.misc.Unsafe.park(Unsafe.java:299)
   at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
   at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2013)
   at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:410)
   at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1036)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1098)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
   at java.lang.Thread.run(Thread.java:818)

#18. Answers Events Handler1

   at java.lang.Object.wait(Object.java)
   at java.lang.Thread.parkFor$(Thread.java:1220)
   at sun.misc.Unsafe.park(Unsafe.java:299)
   at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:198)
   at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2053)
   at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1090)
   at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:806)
   at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1036)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1098)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
   at io.fabric.sdk.android.services.common.ExecutorUtils$1$1.onRun(ExecutorUtils.java:75)
   at io.fabric.sdk.android.services.common.BackgroundPriorityRunnable.run(BackgroundPriorityRunnable.java:30)
   at java.lang.Thread.run(Thread.java:818)

#19. AsyncTask #3

   at java.lang.Object.wait(Object.java)
   at java.lang.Thread.parkFor$(Thread.java:1220)
   at sun.misc.Unsafe.park(Unsafe.java:299)
   at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
   at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2013)
   at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:410)
   at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1036)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1098)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
   at java.lang.Thread.run(Thread.java:818)

#20. FinalizerDaemon

   at java.lang.Object.wait(Object.java)
   at java.lang.Object.wait(Object.java:423)
   at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:101)
   at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:72)
   at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:200)
   at java.lang.Thread.run(Thread.java:818)

#21. AsyncTask #4

   at java.lang.Object.wait(Object.java)
   at java.lang.Thread.parkFor$(Thread.java:1220)
   at sun.misc.Unsafe.park(Unsafe.java:299)
   at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
   at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2013)
   at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:410)
   at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1036)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1098)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
   at java.lang.Thread.run(Thread.java:818)

#22. Queue

   at java.lang.Object.wait(Object.java)
   at java.lang.Thread.parkFor$(Thread.java:1220)
   at sun.misc.Unsafe.park(Unsafe.java:299)
   at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
   at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2013)
   at java.util.concurrent.PriorityBlockingQueue.take(PriorityBlockingQueue.java:510)
   at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.performOperation(DependencyPriorityBlockingQueue.java:197)
   at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.get(DependencyPriorityBlockingQueue.java:236)
   at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take(DependencyPriorityBlockingQueue.java:65)
   at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take(DependencyPriorityBlockingQueue.java:46)
   at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1036)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1098)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
   at java.lang.Thread.run(Thread.java:818)

#23. HeapTaskDaemon

   at dalvik.system.VMRuntime.runHeapTasks(VMRuntime.java)
   at java.lang.Daemons$HeapTaskDaemon.run(Daemons.java:370)
   at java.lang.Thread.run(Thread.java:818)

#24. pool-5-thread-4

   at java.lang.Object.wait(Object.java)
   at java.lang.Thread.parkFor$(Thread.java:1220)
   at sun.misc.Unsafe.park(Unsafe.java:299)
   at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
   at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2013)
   at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:410)
   at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1036)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1098)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
   at java.lang.Thread.run(Thread.java:818)

#25. AsyncTask #7

   at java.lang.Object.wait(Object.java)
   at java.lang.Thread.parkFor$(Thread.java:1220)
   at sun.misc.Unsafe.park(Unsafe.java:299)
   at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
   at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2013)
   at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:410)
   at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1036)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1098)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
   at java.lang.Thread.run(Thread.java:818)

#26. Queue

   at java.lang.Object.wait(Object.java)
   at java.lang.Thread.parkFor$(Thread.java:1220)
   at sun.misc.Unsafe.park(Unsafe.java:299)
   at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
   at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2013)
   at java.util.concurrent.PriorityBlockingQueue.take(PriorityBlockingQueue.java:510)
   at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.performOperation(DependencyPriorityBlockingQueue.java:197)
   at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.get(DependencyPriorityBlockingQueue.java:236)
   at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take(DependencyPriorityBlockingQueue.java:65)
   at io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue.take(DependencyPriorityBlockingQueue.java:46)
   at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1036)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1098)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
   at java.lang.Thread.run(Thread.java:818)

#27. pool-4-thread-1

   at java.lang.Object.wait(Object.java)
   at java.lang.Thread.parkFor$(Thread.java:1220)
   at sun.misc.Unsafe.park(Unsafe.java:299)
   at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
   at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2013)
   at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:410)
   at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1036)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1098)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
   at java.lang.Thread.run(Thread.java:818)

#28. ReferenceQueueDaemon

   at java.lang.Object.wait(Object.java)
   at java.lang.Daemons$ReferenceQueueDaemon.run(Daemons.java:162)
   at java.lang.Thread.run(Thread.java:818)

#29. pool-5-thread-5

   at java.lang.Object.wait(Object.java)
   at java.lang.Thread.parkFor$(Thread.java:1220)
   at sun.misc.Unsafe.park(Unsafe.java:299)
   at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
   at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2013)
   at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:410)
   at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1036)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1098)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
   at java.lang.Thread.run(Thread.java:818)

#30. Crashlytics Exception Handler1

   at dalvik.system.VMStack.getThreadStackTrace(VMStack.java)
   at java.lang.Thread.getStackTrace(Thread.java:580)
   at java.lang.Thread.getAllStackTraces(Thread.java:522)
   at com.crashlytics.android.core.CrashlyticsUncaughtExceptionHandler.writeSessionEvent(CrashlyticsUncaughtExceptionHandler.java:1024)
   at com.crashlytics.android.core.CrashlyticsUncaughtExceptionHandler.writeFatal(CrashlyticsUncaughtExceptionHandler.java:766)
   at com.crashlytics.android.core.CrashlyticsUncaughtExceptionHandler.handleUncaughtException(CrashlyticsUncaughtExceptionHandler.java:262)
   at com.crashlytics.android.core.CrashlyticsUncaughtExceptionHandler.access$100(CrashlyticsUncaughtExceptionHandler.java:55)
   at com.crashlytics.android.core.CrashlyticsUncaughtExceptionHandler$5.call(CrashlyticsUncaughtExceptionHandler.java:238)
   at com.crashlytics.android.core.CrashlyticsUncaughtExceptionHandler$5.call(CrashlyticsUncaughtExceptionHandler.java:235)
   at java.util.concurrent.FutureTask.run(FutureTask.java:237)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
   at io.fabric.sdk.android.services.common.ExecutorUtils$1$1.onRun(ExecutorUtils.java:75)
   at io.fabric.sdk.android.services.common.BackgroundPriorityRunnable.run(BackgroundPriorityRunnable.java:30)
   at java.lang.Thread.run(Thread.java:818)

#31. AsyncTask #5

   at java.lang.Object.wait(Object.java)
   at java.lang.Thread.parkFor$(Thread.java:1220)
   at sun.misc.Unsafe.park(Unsafe.java:299)
   at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
   at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2013)
   at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:410)
   at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1036)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1098)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
   at java.lang.Thread.run(Thread.java:818)

#32. pool-5-thread-2

   at java.lang.Object.wait(Object.java)
   at java.lang.Thread.parkFor$(Thread.java:1220)
   at sun.misc.Unsafe.park(Unsafe.java:299)
   at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
   at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2013)
   at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:410)
   at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1036)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1098)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
   at java.lang.Thread.run(Thread.java:818)

Camera permissions always denied when Kite SDK implemented

We noticed that our Camera permissions were being denied without prompting in our app, and we finally tracked it down to the Kite SDK implementation. To test, I created a brand new project and added the Kite SDK to our gradle. When testing permissions, it allowed multiple others, but camera was denied without even prompting, just as it was doing in our project. I remove Kite from gradle, then it works fine and allows the prompt for camera usage.

I'm currently looking through the source code to see where it could be doing this in the SDK, but just wanted to give a heads up on it in the meantime.

Filename too long when startingShopping with very long url

I'm calling startShopping an asset that has a url that is 391 characters long. It is very long as it has GET parameters holding signatures to access the content.

The stack trace reports:

10-03 10:43:27.090 4413-4554/? E/FileDownloader: Unable to download to file java.io.IOException: open failed: ENAMETOOLONG (File name too long) at java.io.File.createNewFile(File.java:939) at java.io.File.createTempFile(File.java:1004) at java.io.File.createTempFile(File.java:961) at ly.kite.util.FileDownloader.download(FileDownloader.java:144) at ly.kite.util.FileDownloader$DownloaderTask.doInBackground(FileDownloader.java:345) at ly.kite.util.FileDownloader$DownloaderTask.doInBackground(FileDownloader.java:308) at android.os.AsyncTask$2.call(AsyncTask.java:295) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) at java.lang.Thread.run(Thread.java:818)

I haven't looked into the details too much for a solution but perhaps the filename generation could strip query parameters to shorten it before hand.

Invalid request when paying with credit card in live mode

I am having trouble with the payment means.

I've been able to put orders from the emulator, in test mode, using credit card. When I try the same from a mobile phone, I can never complete an order. I've tried with my app as well as with the sample app. I always get a popup with the message "Oops! Invalid request - see details". The scanner for credit cards doesn't work either. I did all my tests in test mode, never tried with the live mode.

I can provide full Logcat logs if you wish. Please find below a Logcat log with the warnings and errors that I found when trying to pay with a credit card. It states that "Connect to /65.50.196.201:443 timed out"

I tried with different smartphones, including a Motorola Moto G and a LG G3 S.

04-05 20:22:27.871 271-271/? D/SFPerfTracer﹕ layers: (6:12) (DimLayer: 0:81)* (DimLayer: 0:8)* (FocusedStackFrame: 1:846)* (StatusBar: 3:7749) (NavigationBar: 0:3640) (com.android.systemui.ImageWallpaper: 0:400)* (DimLayer: 1:777) (DimLayer: 0:183)* (es.o3r3.postalprint/io.card.payment.DataEntryActivity: 0:119)* (InputMethod: 1:68) (es.o3r3.postalprint/ly.kite.checkout.PaymentActivity: 20:31) (Processing: 245:265)
04-05 20:22:28.040 1022-1087/? D/WifiStateMachine﹕ handleMessage: E msg.what=151572
04-05 20:22:28.040 1022-1087/? D/WifiStateMachine﹕ processMsg: ConnectedState
04-05 20:22:28.040 1022-1087/? D/WifiStateMachine﹕ processMsg: L2ConnectedState
04-05 20:22:28.044 1022-1087/? D/WifiStateMachine﹕ handleMessage: X
04-05 20:22:28.668 29571-30792/es.o3r3.postalprint W/System.err﹕ org.apache.http.conn.ConnectTimeoutException: Connect to /65.50.196.201:443 timed out
04-05 20:22:28.676 29571-30792/es.o3r3.postalprint W/System.err﹕ at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:121)
04-05 20:22:28.678 29571-30792/es.o3r3.postalprint W/System.err﹕ at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
04-05 20:22:28.681 29571-30792/es.o3r3.postalprint W/System.err﹕ at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
04-05 20:22:28.682 29571-30792/es.o3r3.postalprint W/System.err﹕ at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
04-05 20:22:28.683 29571-30792/es.o3r3.postalprint W/System.err﹕ at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:374)
04-05 20:22:28.684 29571-30792/es.o3r3.postalprint W/System.err﹕ at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:575)
04-05 20:22:28.686 29571-30792/es.o3r3.postalprint W/System.err﹕ at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:498)
04-05 20:22:28.688 29571-30792/es.o3r3.postalprint W/System.err﹕ at io.card.payment.ak.run(Unknown Source)
04-05 20:22:28.689 29571-30792/es.o3r3.postalprint W/System.err﹕ at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
04-05 20:22:28.689 29571-30792/es.o3r3.postalprint W/System.err﹕ at java.util.concurrent.FutureTask.run(FutureTask.java:237)
04-05 20:22:28.690 29571-30792/es.o3r3.postalprint W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
04-05 20:22:28.691 29571-30792/es.o3r3.postalprint W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
04-05 20:22:28.692 29571-30792/es.o3r3.postalprint W/System.err﹕ at java.lang.Thread.run(Thread.java:841)

Login Failed when paying with Paypal

Paypal doesn't work, it always says that I entered the wrong credentials, which I checked in Paypal.com. It happens to me in the emulator as well as in a real device, in sandbox mode.

The popup says "Login Failed. Invalid login information. Please try again."

Please find below the logcat log for this issue.

04-06 12:50:16.857 331-354/system_process I/ActivityManager﹕ Displayed es.o3r3.kiteprintapp/com.paypal.android.sdk.payments.PaymentMethodActivity: +73ms
04-06 12:50:18.029 331-466/system_process D/MobileDataStateTracker﹕ default: setPolicyDataEnable(enabled=true)
04-06 12:50:36.457 58-58/? D/Genyd﹕ Received Set Clipboard
04-06 12:50:36.457 58-58/? D/Genymotion﹕ Received Set Clipboard
04-06 12:50:39.045 331-686/system_process I/ActivityManager﹕ START u0 {cmp=es.o3r3.kiteprintapp/com.paypal.android.sdk.payments.PaymentConfirmActivity (has extras)} from pid 1319
04-06 12:50:39.053 410-419/? W/genymotion_audio﹕ out_write() limiting sleep time 69659 to 23219
04-06 12:50:39.081 410-419/? W/genymotion_audio﹕ out_write() limiting sleep time 34829 to 23219
04-06 12:50:39.089 331-686/system_process D/dalvikvm﹕ GC_FOR_ALLOC freed 530K, 18% free 13876K/16740K, paused 4ms, total 5ms
04-06 12:50:39.097 331-686/system_process D/dalvikvm﹕ GC_FOR_ALLOC freed 748K, 20% free 13499K/16740K, paused 5ms, total 5ms
04-06 12:50:39.097 331-466/system_process D/MobileDataStateTracker﹕ default: setPolicyDataEnable(enabled=true)
04-06 12:50:39.109 1319-1319/es.o3r3.kiteprintapp D/dalvikvm﹕ GC_FOR_ALLOC freed 470K, 10% free 11643K/12804K, paused 5ms, total 5ms
04-06 12:50:39.109 1319-1319/es.o3r3.kiteprintapp I/dalvikvm-heap﹕ Grow heap (frag case) to 11.580MB for 193128-byte allocation
04-06 12:50:39.113 1319-1328/es.o3r3.kiteprintapp D/dalvikvm﹕ GC_FOR_ALLOC freed <1K, 9% free 11831K/12996K, paused 4ms, total 5ms
04-06 12:50:39.125 331-534/system_process I/ActivityManager﹕ START u0 {cmp=es.o3r3.kiteprintapp/com.paypal.android.sdk.payments.LoginActivity (has extras)} from pid 1319
04-06 12:50:39.145 1319-1319/es.o3r3.kiteprintapp W/EGL_genymotion﹕ eglSurfaceAttrib not implemented
04-06 12:50:39.165 331-466/system_process D/MobileDataStateTracker﹕ default: setPolicyDataEnable(enabled=true)
04-06 12:50:39.181 331-686/system_process W/InputMethodManagerService﹕ Focus gain on non-focused client com.android.internal.view.IInputMethodClient$Stub$Proxy@52c58f60 (uid=10055 pid=1319)
04-06 12:50:39.189 1319-1319/es.o3r3.kiteprintapp D/dalvikvm﹕ GC_FOR_ALLOC freed 648K, 9% free 11922K/12996K, paused 6ms, total 6ms
04-06 12:50:39.189 1319-1319/es.o3r3.kiteprintapp I/dalvikvm-heap﹕ Grow heap (frag case) to 11.852MB for 193128-byte allocation
04-06 12:50:39.193 1319-1328/es.o3r3.kiteprintapp D/dalvikvm﹕ GC_FOR_ALLOC freed 3K, 9% free 12108K/13188K, paused 6ms, total 6ms
04-06 12:50:39.229 1319-1319/es.o3r3.kiteprintapp W/EGL_genymotion﹕ eglSurfaceAttrib not implemented
04-06 12:50:39.237 1319-1319/es.o3r3.kiteprintapp W/EGL_genymotion﹕ eglSurfaceAttrib not implemented
04-06 12:50:39.281 331-466/system_process D/MobileDataStateTracker﹕ default: setPolicyDataEnable(enabled=true)
04-06 12:50:39.313 331-354/system_process I/ActivityManager﹕ Displayed es.o3r3.kiteprintapp/com.paypal.android.sdk.payments.LoginActivity: +163ms (total +213ms)
04-06 12:50:39.313 331-354/system_process I/ActivityManager﹕ Displayed es.o3r3.kiteprintapp/com.paypal.android.sdk.payments.PaymentConfirmActivity: +213ms
04-06 12:50:39.345 595-595/com.android.inputmethod.latin V/InputMethodService﹕ onEvaluateInputViewShown: config.hardKeyboardHidden = 2
04-06 12:50:39.345 595-595/com.android.inputmethod.latin V/InputMethodService﹕ onEvaluateInputViewShown: config.hardKeyboardHidden = 2
04-06 12:50:39.357 595-595/com.android.inputmethod.latin D/dalvikvm﹕ GC_FOR_ALLOC freed 279K, 4% free 9020K/9324K, paused 2ms, total 2ms
04-06 12:50:39.377 595-595/com.android.inputmethod.latin I/ResourceUtils﹕ Found default value: resource=sudden_jumping_touch_event_device_list build=[HARDWARE=vbox86 MODEL=Samsung Galaxy S3 - 4.3 - API 18 - 720x1280 BRAND=generic MANUFACTURER=Genymotion] default=false
04-06 12:50:39.377 595-595/com.android.inputmethod.latin I/ResourceUtils﹕ Found default value: resource=phantom_sudden_move_event_device_list build=[HARDWARE=vbox86 MODEL=Samsung Galaxy S3 - 4.3 - API 18 - 720x1280 BRAND=generic MANUFACTURER=Genymotion] default=false
04-06 12:50:39.381 595-595/com.android.inputmethod.latin V/InputMethodService﹕ onEvaluateInputViewShown: config.hardKeyboardHidden = 2
04-06 12:50:39.385 595-595/com.android.inputmethod.latin I/ResourceUtils﹕ Found default value: resource=keyboard_heights build=[HARDWARE=vbox86 MODEL=Samsung Galaxy S3 - 4.3 - API 18 - 720x1280 BRAND=generic MANUFACTURER=Genymotion] default=
04-06 12:50:39.405 595-595/com.android.inputmethod.latin D/dalvikvm﹕ GC_FOR_ALLOC freed 83K, 2% free 9442K/9552K, paused 4ms, total 4ms
04-06 12:50:39.437 595-595/com.android.inputmethod.latin V/InputMethodService﹕ onEvaluateInputViewShown: config.hardKeyboardHidden = 2
04-06 12:50:39.453 595-595/com.android.inputmethod.latin V/InputMethodService﹕ onEvaluateInputViewShown: config.hardKeyboardHidden = 2
04-06 12:50:39.477 595-595/com.android.inputmethod.latin D/libEGL﹕ loaded /system/lib/egl/libEGL_genymotion.so
04-06 12:50:39.477 595-595/com.android.inputmethod.latin D/﹕ HostConnection::get() New Host Connection established 0xb878e0f8, tid 595
04-06 12:50:39.485 595-595/com.android.inputmethod.latin D/libEGL﹕ loaded /system/lib/egl/libGLESv1_CM_genymotion.so
04-06 12:50:39.485 595-595/com.android.inputmethod.latin D/libEGL﹕ loaded /system/lib/egl/libGLESv2_genymotion.so
04-06 12:50:39.497 595-595/com.android.inputmethod.latin W/EGL_genymotion﹕ eglSurfaceAttrib not implemented
04-06 12:50:39.497 595-595/com.android.inputmethod.latin E/OpenGLRenderer﹕ Getting MAX_TEXTURE_SIZE from GradienCache
04-06 12:50:39.501 595-595/com.android.inputmethod.latin E/OpenGLRenderer﹕ Getting MAX_TEXTURE_SIZE from Caches::initConstraints()
04-06 12:50:39.501 595-595/com.android.inputmethod.latin D/OpenGLRenderer﹕ Enabling debug mode 0
04-06 12:50:39.533 595-595/com.android.inputmethod.latin W/EGL_genymotion﹕ eglSurfaceAttrib not implemented
04-06 12:50:39.545 331-466/system_process D/MobileDataStateTracker﹕ default: setPolicyDataEnable(enabled=true)
04-06 12:50:40.201 1319-1382/es.o3r3.kiteprintapp D/dalvikvm﹕ GC_FOR_ALLOC freed 840K, 7% free 12370K/13240K, paused 4ms, total 5ms
04-06 12:50:40.445 331-466/system_process D/MobileDataStateTracker﹕ default: setPolicyDataEnable(enabled=true)
04-06 12:50:47.833 595-595/com.android.inputmethod.latin D/dalvikvm﹕ GC_FOR_ALLOC freed 194K, 3% free 9736K/9956K, paused 2ms, total 3ms
04-06 12:50:47.837 595-595/com.android.inputmethod.latin I/dalvikvm-heap﹕ Grow heap (frag case) to 11.054MB for 1598412-byte allocation
04-06 12:50:47.837 595-595/com.android.inputmethod.latin D/dalvikvm﹕ GC_FOR_ALLOC freed 15K, 3% free 11282K/11520K, paused 2ms, total 2ms
04-06 12:50:52.429 595-595/com.android.inputmethod.latin V/InputMethodService﹕ onEvaluateInputViewShown: config.hardKeyboardHidden = 2
04-06 12:50:52.429 410-419/? W/genymotion_audio﹕ out_write() limiting sleep time 69659 to 23219
04-06 12:50:52.453 410-419/? W/genymotion_audio﹕ out_write() limiting sleep time 34829 to 23219
04-06 12:50:52.461 331-346/system_process D/dalvikvm﹕ GC_FOR_ALLOC freed 1476K, 22% free 13202K/16740K, paused 9ms, total 10ms
04-06 12:50:52.461 595-595/com.android.inputmethod.latin V/InputMethodService﹕ onEvaluateInputViewShown: config.hardKeyboardHidden = 2
04-06 12:50:52.461 595-595/com.android.inputmethod.latin V/InputMethodService﹕ onEvaluateInputViewShown: config.hardKeyboardHidden = 2
04-06 12:50:52.461 595-595/com.android.inputmethod.latin V/InputMethodService﹕ onEvaluateInputViewShown: config.hardKeyboardHidden = 2
04-06 12:50:52.461 595-595/com.android.inputmethod.latin V/InputMethodService﹕ onEvaluateInputViewShown: config.hardKeyboardHidden = 2
04-06 12:50:52.501 410-419/? W/genymotion_audio﹕ out_write() limiting sleep time 34828 to 23219
04-06 12:50:53.209 331-466/system_process D/MobileDataStateTracker﹕ default: setPolicyDataEnable(enabled=true)
04-06 12:50:58.305 410-419/? W/genymotion_audio﹕ out_write() limiting sleep time 69659 to 23219
04-06 12:50:58.325 410-419/? W/genymotion_audio﹕ out_write() limiting sleep time 34829 to 23219
04-06 12:50:58.329 1319-1319/es.o3r3.kiteprintapp W/EGL_genymotion﹕ eglSurfaceAttrib not implemented
04-06 12:50:58.965 331-466/system_process D/MobileDataStateTracker﹕ default: setPolicyDataEnable(enabled=true)
04-06 12:51:00.949 331-466/system_process D/MobileDataStateTracker﹕ default: setPolicyDataEnable(enabled=true)
04-06 12:51:02.961 331-466/system_process D/MobileDataStateTracker﹕ default: setPolicyDataEnable(enabled=true)
04-06 12:51:03.861 1319-1380/es.o3r3.kiteprintapp E/RequestError﹕ , Mobile Login failed.
04-06 12:51:03.861 1319-1319/es.o3r3.kiteprintapp E/PayPalService﹕ 10803
04-06 12:51:03.869 1319-1319/es.o3r3.kiteprintapp E/LoginActivity﹕ login error: 10803
04-06 12:51:03.873 595-595/com.android.inputmethod.latin V/InputMethodService﹕ onEvaluateInputViewShown: config.hardKeyboardHidden = 2
04-06 12:51:03.897 1319-1319/es.o3r3.kiteprintapp W/EGL_genymotion﹕ eglSurfaceAttrib not implemented
04-06 12:51:03.897 1319-1319/es.o3r3.kiteprintapp W/IInputConnectionWrapper﹕ getTextBeforeCursor on inactive InputConnection
04-06 12:51:03.913 1319-1319/es.o3r3.kiteprintapp W/IInputConnectionWrapper﹕ getTextBeforeCursor on inactive InputConnection
04-06 12:51:03.913 595-595/com.android.inputmethod.latin V/InputMethodService﹕ onEvaluateInputViewShown: config.hardKeyboardHidden = 2
04-06 12:51:03.913 595-595/com.android.inputmethod.latin V/InputMethodService﹕ onEvaluateInputViewShown: config.hardKeyboardHidden = 2
04-06 12:51:03.913 595-595/com.android.inputmethod.latin V/InputMethodService﹕ onEvaluateInputViewShown: config.hardKeyboardHidden = 2
04-06 12:51:03.913 595-595/com.android.inputmethod.latin V/InputMethodService﹕ onEvaluateInputViewShown: config.hardKeyboardHidden = 2
04-06 12:51:03.913 595-595/com.android.inputmethod.latin V/InputMethodService﹕ onEvaluateInputViewShown: config.hardKeyboardHidden = 2
04-06 12:51:03.925 595-595/com.android.inputmethod.latin V/InputMethodService﹕ onEvaluateInputViewShown: config.hardKeyboardHidden = 2
04-06 12:51:03.925 595-595/com.android.inputmethod.latin V/InputMethodService﹕ onEvaluateInputViewShown: config.hardKeyboardHidden = 2
04-06 12:51:03.925 595-595/com.android.inputmethod.latin V/InputMethodService﹕ onEvaluateInputViewShown: config.hardKeyboardHidden = 2
04-06 12:51:03.925 595-595/com.android.inputmethod.latin V/InputMethodService﹕ onEvaluateInputViewShown: config.hardKeyboardHidden = 2
04-06 12:51:04.177 331-466/system_process D/MobileDataStateTracker﹕ default: setPolicyDataEnable(enabled=true)
04-06 12:51:04.473 1319-1380/es.o3r3.kiteprintapp D/dalvikvm﹕ GC_FOR_ALLOC freed 1146K, 9% free 12419K/13592K, paused 5ms, total 6ms

Cannot import using gradle

Added mavenCentral()
Added "compile 'ly.kite:kite-print-sdk:4.+'" to dependencies in build.gradle.
Gradle sync passes ok but when I try to use the KiteSDK object studio does not finds it.
.

Documentation is incorrect?

I am setting up the Kite SDK based of this(the docs on creating an print order):

https://github.com/OceanLabs/Android-Print-SDK/blob/master/docs/create_print_order.md

I've included the following into the build.gradle and successfully synced the project:

compile 'ly.kite:kite-print-sdk:4.+'

Now, here's where the error occurs:

KitePrintSDK.initialize("REPLACE_WITH_YOUR_API_KEY", KitePrintSDK.Environment.TEST, MyActivity.this);

  1. Apparently, the SDK is called KiteSDK instead of KitePrintSDK.
  2. I get the following syntax errors whilst trying to initialize the SDK:

KiteSDK.initialize("MY_API_KEY", KiteSDK.Environment.TEST, MainCollageActivity.this);
"Cannot resolve method initialize(Java.lang.String, ?, com.app.test.test"

How can I initialize this SDK? Is the documentation wrong or am I missing something.

Thank you in advance.

Errors whilst adding SDK to app

When trying to add the KiteSDK to my project in Android Studio by downloading it and doing it manually (I would like to customize the SDK to my liking), I run into an issue.

The issue is that when adding the SDK as module to my app, the SDK for some reason doesn't recognize the app compat library.

I've tried removing all app compat dependencies in my app so there's no confilct, but, the SDK still doesn't recognize that app compat library that's required.

Is there anything I should know before adding the SDK manually to my app?

Thanks.

Crash when selecting Facebook photos from FB Image source

When I click on an album, then select a single photo from the album, the app crashes with the following error:

org.json.JSONException: No value for cover_photo

Line 834 in FacebookAgent.java

Please take a look into it.

Thank you.

Device: S6/Edge - After Paypal sandbox payment

BUG: Device: S6/Edge - After Paypal sandbox payment, the file uploader was displayed, it didn't progress any on the % indicator and then showed me a blank black screen and minimised the app. I hit back a few times, the app was then frozen on a previous screen and I had to kill it - maybe it crashed but not clear ... Went back into the app and get a Kite is not responding message WAIT/KILL - I'm waiting to see what happens, maybe it's trying to process the upload in the background ?

fionnconcannon [1:48 PM]
Closed the app and it's reset from the beginning now. Will check if it processed the file and try to reproduce

Unable to validate payment. (Sandbox)

Having issues trying to test an order in sandbox mode. I'm using fake credit card data from http://www.getcreditcardnumbers.com/.

I keep getting a dialog pop up saying: "Oops! We were unable to validate your payment. (P11)

Here's what I'm seeing in Logcat:
07-07 16:12:33.350 3832-3832/com.dljonesapps.picstamatic I/StripeCreditCardFrag.: Successfully retrieved Stripe token: <com.stripe.android.model.Token@5501661 id=> JSON: { "card": { "address_city": null, "address_country": null, "address_line1": null, "address_line2": null, "address_state": null, "address_zip": null, "country": "GB", "currency": null, "cvc": null, "exp_month": 9, "exp_year": 2019, "fingerprint": "6mkwmB7fgdTlZoBZ", "last4": "3792", "name": null, "number": null, "type": "Visa" }, "created": "Jul 7, 2017 4:12:34 PM", "id": "tok_1Ad3kc23ZjpKAxBPjMRV1WjQ", "livemode": false, "used": false }

Recommendation for Java/Maven Integration

Hi Kite Team,

what is your recommendation to integrate the api for a java web application; I do not find any non android ready to use java libraries. Do you offer openapi / swagger spec or sth similar?

thx Martin

POSTCARD.getDefaultTemplate() returns wrong value

Using the code from the sample app gives an error, since ProductType.POSTCARD.getDefaultTemplate() returns "id_postcard", which seems to be wrong.

printOrder.addPrintJob(PrintJob.createPostcardPrintJob(
    ProductType.POSTCARD.getDefaultTemplate(), assets.get(0), "Hello World!", 
    Address.getKiteTeamAddress()));

What works for me is setting the template to "postcard".

PrintJob printJob = PrintJob.createPostcardPrintJob("postcard", assets.get(0), content, address);

Crash during checkout

Crash when starting creating a case. Size of the image passed is 1440x2392

OS: Android Nougat
Device: Nexus 6p

    Process: bazaart.me.patternator, PID: 27562
    java.lang.RuntimeException: android.os.TransactionTooLargeException: data parcel size 763700 bytes
        at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3752)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6077)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
     Caused by: android.os.TransactionTooLargeException: data parcel size 763700 bytes
        at android.os.BinderProxy.transactNative(Native Method)
        at android.os.BinderProxy.transact(Binder.java:615)
        at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:3606)
        at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3744)
        at android.os.Handler.handleCallback(Handler.java:751) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6077) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 

Crash when open KiteSDK

The app crash suddenly after processing my assets.
Please check the log below :

05-24 03:14:13.661 1698-1698/? E/CatalogueLoader: Unable to parse JSON product: {"wholesale_cost":{"CAD":"0.0000","EUR":"34.9900","GBP":"24.5000","NZD":"0.0000","AUD":"0.0000","SGD":"0.0000","ZAR":"0.0000","USD":"36.9900"},"sandbox_active":true,"print_in_store":false,"id":266334,"wholesale_shipping_costs":{"USA":{"CAD":"0","EUR":"7.0900","GBP":"5.0000","NZD":"0","AUD":"0","SGD":"0","USD":"7.5000"},"rest_of_world":{"CAD":"0","EUR":"8.0000","GBP":"5.6000","NZD":"0","AUD":"0","SGD":"0","USD":"8.5000"},"GBR":{"CAD":"0","EUR":"7.0900","GBP":"5.0000","NZD":"0","AUD":"0","SGD":"0","USD":"7.5000"},"europe":{"CAD":"0","EUR":"6.6000","GBP":"4.6000","NZD":"0","AUD":"0","SGD":"0","USD":"7.0000"}},"name":"American Apparel Zip Fleece Hoodie","valid_sizes":["S","M","L","XL","XXL"],"description_markdown":"","product_category":"Apparel","template_id":"aa_zip_hoodie","product_active":true,"modification_colors":[1,2,5,7,26,120,317,393],"active":true,"modification_costs":[{"modification__modification_id":"center_back","cost":"5.0000","cost_currency":"GBP"},{"modification__modification_id":"center_back","cost":"7.0000","cost_currency":"EUR"},{"modification__modification_id":"center_back","cost":"7.8000","cost_currency":"USD"},{"modification__modification_id":"center_chest","cost":"5.0000","cost_currency":"GBP"},{"modification__modification_id":"center_chest","cost":"7.0000","cost_currency":"EUR"},{"modification__modification_id":"center_chest","cost":"7.8000","cost_currency":"USD"},{"modification__modification_id":"top_chest","cost":"5.0000","cost_currency":"GBP"},{"modification__modification_id":"top_chest","cost":"7.0000","cost_currency":"EUR"},{"modification__modification_id":"top_chest","cost":"7.8000","cost_currency":"USD"},{"modification__modification_id":"left_chest","cost":"5.0000","cost_currency":"GBP"},{"modification__modification_id":"left_chest","cost":"7.0000","cost_currency":"EUR"},{"modification__modification_id":"left_chest","cost":"7.8000","cost_currency":"USD"},{"modification__modification_id":"right_chest","cost":"5.0000","cost_currency":"GBP"},{"modification__modification_id":"right_chest","cost":"7.0000","cost_currency":"EUR"},{"modification__modification_id":"right_chest","cost":"7.8000","cost_currency":"USD"}],"shipping_costs":{"USA":{"CAD":"0","EUR":"8.50800","GBP":"6.00000","NZD":"0","AUD":"0","SGD":"0","USD":"9.00000"},"rest_of_world":{"CAD":"0","EUR":"9.60000","GBP":"6.72000","NZD":"0","AUD":"0","SGD":"0","USD":"10.20000"},"GBR":{"CAD":"0","EUR":"8.50800","GBP":"6.00000","NZD":"0","AUD":"0","SGD":"0","USD":"9.00000"},"europe":{"CAD":"0","EUR":"7.92000","GBP":"5.52000","NZD":"0","AUD":"0","SGD":"0","USD":"8.40000"}},"description":"American Apparel Zip Fleece Hoodie","product":{"size":{"cm":{"height":0.04,"width":0.04},"inch":{"height":0.01,"width":0.01}},"ios_sdk_product_class":"Apparel","ios_sdk_label_color":[203,86,157],"ios_sdk_product_shots":["https://s3.amazonaws.com/sdk-static/product_photography/apparel/cover_hoodie.jpg"],"ios_sdk_cover_photo":"https://s3.amazonaws.com/sdk-static/product_photography/apparel/top_level.jpg","ios_sdk_ui_class":"","ios_sdk_product_type":"","pdf_height":2383.93700787,"product_code":"DTG-UH-AA004","pdf_width":1683.77952756},"images_required":1,"resource_uri":"/v2.0/template/aa_zip_hoodie/","upsell_offers":[],"cost":[{"template":"/v2.1/template/aa_zip_hoodie/","formatted":"€60.99","id":1109457,"amount":"60.9900","currency":"EUR"},{"template":"/v2.1/template/aa_zip_hoodie/","formatted":"£42.99","id":1109456,"amount":"42.9900","currency":"GBP"},{"template":"/v2.1/template/aa_zip_hoodie/","formatted":"$64.99","id":1109455,"amount":"64.9900","currency":"USD"}],"modifications":[4]}
org.json.JSONException: No value for ios_sdk_class_photo
at org.json.JSONObject.get(JSONObject.java:389)
at org.json.JSONObject.getString(JSONObject.java:550)
at ly.kite.catalogue.CatalogueLoader.parseProducts(CatalogueLoader.java:477)
at ly.kite.catalogue.CatalogueLoader.onCatalogue(CatalogueLoader.java:772)
at ly.kite.catalogue.CatalogueLoader.onSuccess(CatalogueLoader.java:611)
at l
05-24 03:14:13.711 1698-1698/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.pixil.instaarabic, PID: 1698
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String ly.kite.address.Country.displayName()' on a null object reference
at ly.kite.analytics.Analytics.getPropertiesJSONObject(Analytics.java:430)
at ly.kite.analytics.Analytics.trackSDKLoaded(Analytics.java:486)
at ly.kite.journey.selection.ChooseProductGroupFragment.onCreateView(ChooseProductGroupFragment.java:119)
at android.app.Fragment.performCreateView(Fragment.java:2220)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:973)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148)
at android.app.BackStackRecord.run(BackStackRecord.java:793)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1535)
at android.app.FragmentManagerImpl$1.run(FragmentManager.java:482)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

I use google nexus 5 emulator with android version API 23. Do you have any suggestion?

Error Retrieving Products

I tried following the Quick Integration steps, however in my app I'm greeted with this screen:

Screenshot_20220207-155330

Logcat says this:

W/DefaultRequestDirector: Authentication error: Unable to respond to any of these challenges: {}

Better Crop/Review screen title

Currently the title is the product/device name which is not great (see my very bad photo of the screen -- sorry quickest route to getting a "screenshot"). This might be bettered titled "Position Photo"

img_3822

Add resourcePrefix to prevent resource naming clashes

When using the library your resources can potentially override those of our app.

E.g. if we have a string called Total in our app resources but have yet to translate it into French then our app is forced to use the string defined by your SDK.

This behaviour is not ideal as we may want to have the French change to the default language of our app and this should ideally not be affected by using your library.

I'd suggest using resourcePrefix in the SDK's build.gradle:

android {
  resourcePrefix 'kitesdk_'
}

This will flag up errors on any resources that are yet to conform to the above prefix so they can be standardised within your SDK.

More info on resource prefix:

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.