Fix issue #2097313: Latin IME crashes first use

Change-Id: I50c48b66aff5aff42e71058591d20775eba73fed
diff --git a/services/java/com/android/server/InputMethodManagerService.java b/services/java/com/android/server/InputMethodManagerService.java
index 3c37b49..558a024 100644
--- a/services/java/com/android/server/InputMethodManagerService.java
+++ b/services/java/com/android/server/InputMethodManagerService.java
@@ -516,7 +516,11 @@
         synchronized (mMethodMap) {
             if (!mSystemReady) {
                 mSystemReady = true;
-                startInputInnerLocked();
+                try {
+                    startInputInnerLocked();
+                } catch (RuntimeException e) {
+                    Log.w(TAG, "Unexpected exception", e);
+                }
             }
         }
     }
@@ -749,7 +753,7 @@
         if (!mSystemReady) {
             // If the system is not yet ready, we shouldn't be running third
             // party code.
-            return new InputBindResult(null, mCurId, mCurSeq);
+            return new InputBindResult(null, mCurMethodId, mCurSeq);
         }
         
         InputMethodInfo info = mMethodMap.get(mCurMethodId);
@@ -802,17 +806,20 @@
         synchronized (mMethodMap) {
             if (mCurIntent != null && name.equals(mCurIntent.getComponent())) {
                 mCurMethod = IInputMethod.Stub.asInterface(service);
+                if (mCurToken == null) {
+                    Log.w(TAG, "Service connected without a token!");
+                    unbindCurrentMethodLocked(false);
+                    return;
+                }
+                if (DEBUG) Log.v(TAG, "Initiating attach with token: " + mCurToken);
+                executeOrSendMessage(mCurMethod, mCaller.obtainMessageOO(
+                        MSG_ATTACH_TOKEN, mCurMethod, mCurToken));
                 if (mCurClient != null) {
-                    if (DEBUG) Log.v(TAG, "Initiating attach with token: " + mCurToken);
+                    if (DEBUG) Log.v(TAG, "Creating first session while with client "
+                            + mCurClient);
                     executeOrSendMessage(mCurMethod, mCaller.obtainMessageOO(
-                            MSG_ATTACH_TOKEN, mCurMethod, mCurToken));
-                    if (mCurClient != null) {
-                        if (DEBUG) Log.v(TAG, "Creating first session while with client "
-                                + mCurClient);
-                        executeOrSendMessage(mCurMethod, mCaller.obtainMessageOO(
-                                MSG_CREATE_SESSION, mCurMethod,
-                                new MethodCallback(mCurMethod)));
-                    }
+                            MSG_CREATE_SESSION, mCurMethod,
+                            new MethodCallback(mCurMethod)));
                 }
             }
         }
@@ -1002,6 +1009,11 @@
             mShowExplicitlyRequested = true;
             mShowForced = true;
         }
+        
+        if (!mSystemReady) {
+            return false;
+        }
+        
         boolean res = false;
         if (mCurMethod != null) {
             executeOrSendMessage(mCurMethod, mCaller.obtainMessageIOO(
@@ -1637,7 +1649,7 @@
                     + " mShowExplicitlyRequested=" + mShowExplicitlyRequested
                     + " mShowForced=" + mShowForced
                     + " mInputShown=" + mInputShown);
-            p.println("  mScreenOn=" + mScreenOn);
+            p.println("  mSystemReady=" + mSystemReady + " mScreenOn=" + mScreenOn);
         }
         
         if (client != null) {