Search code examples
javaandroidgigya

Gigya SDK - Android 3.1 SDK - App crash


If for some reason there's no Internet connection or the request fails, the app crashes when calling:

GSAPI.getInstance().initialize(this, GIGYA_API_KEY);

The question is: is there someway to catch the Exception? (java.net.SocketTimeoutException and java.util.ConcurrentModificationException)

Trace:

08-19 17:53:22.971    2062-2062/************ E/GSAPI﹕ Unable to load config from server:*********** GSResponse Log ***********
    apiKey: ************
    userKey: apiMethod: getSDKConfig
    params: {"enabledProviders":"","ucid":"************","sdk":"android_3.1","format":"json","targetEnv":"mobile","apiKey":"************","include":"permissions"}
    useHTTPS: false
    sdk: android_3.1
    post_data: apiKey=************&enabledProviders=&format=json&httpStatusCodes=false&include=permissions&sdk=android_3.1&targetEnv=mobile&ucid=************&
    url: http://socialize.us1.gigya.com/socialize.getSDKConfig
    java.net.SocketTimeoutException: failed to connect to socialize.us1.gigya.com/23.12.180.171 (port 80) after 5000ms
            at libcore.io.IoBridge.connectErrno(IoBridge.java:159)
            at libcore.io.IoBridge.connect(IoBridge.java:112)
            at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
            at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
            at java.net.Socket.connect(Socket.java:843)
            at com.android.okhttp.internal.Platform.connectSocket(Platform.java:131)
            at com.android.okhttp.Connection.connect(Connection.java:101)
            at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:294)
            at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255)
            at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:296)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:179)
            at com.gigya.socialize.GSRequest.sendRequest(Unknown Source)
            at com.gigya.socialize.GSRequest.send(Unknown Source)
            at ************.GSAsyncRequest$GSRequestTask.doInBackground(Unknown Source)
            at ************.GSAsyncRequest$GSRequestTask.doInBackground(Unknown Source)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:841)
08-19 17:53:22.971    2062-2062/************ D/AndroidRuntime﹕ Shutting down VM
08-19 17:53:22.981    2062-2062/************ W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0xb0d6db20)
08-19 17:53:26.011    2062-2062/************ E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: ************, PID: 2062
    java.util.ConcurrentModificationException
            at java.util.HashMap$HashIterator.nextEntry(HashMap.java:806)
            at java.util.HashMap$KeyIterator.next(HashMap.java:833)
            at com.gigya.socialize.android.login.LoginProviderFactory.validatePermissions(Unknown Source)
            at com.gigya.socialize.android.GSAPI$10.onGSResponse(Unknown Source)
            at com.gigya.socialize.android.GSAsyncRequest$1.onGSResponse(Unknown Source)
            at com.gigya.socialize.android.GSAsyncRequest$GSRequestTask.onPostExecute(Unknown Source)
            at com.gigya.socialize.android.GSAsyncRequest$GSRequestTask.onPostExecute(Unknown Source)
            at android.os.AsyncTask.finish(AsyncTask.java:632)
            at android.os.AsyncTask.access$600(AsyncTask.java:177)
            at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5017)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
            at dalvik.system.NativeStart.main(Native Method)

Solution

  • Gigya has a bug fix for this planned in an upcoming patch. While you wait for the patch to correct this error, you can patch the Gigya mobile SDK yourself, by downloading it, and making the changes below, and recompiling:

    ./main/java/com/gigya/socialize/android/login/LoginProviderFactory.java


    After

    import java.util.Hashmap;
    

    Add

    import java.util.concurrent.ConcurrentHashMap;
    

    Replace

    private HashMap<String, LoginProvider> providers = new HashMap<String, LoginProvider>();
    

    With

    private ConcurrentHashMap<String, LoginProvider> providers = new ConcurrentHashMap<String, LoginProvider>();
    

    Replace

    public HashMap<String, LoginProvider> getLoginProviders() {
        return providers;
    }
    

    With

    public HashMap<String, LoginProvider> getLoginProviders() {
        return new HashMap<String, LoginProvider>(providers);
    }