KeyChain: annotate with @WorkerThread

Several methods need to be called off the main UI thread. This is
the first documentation of that requirement.

Bug: 19440165
Change-Id: I0303011c0ded6ec1efa92119c1e02a8a39b14a59
diff --git a/keystore/java/android/security/KeyChain.java b/keystore/java/android/security/KeyChain.java
index f482bf0..7de26d6 100644
--- a/keystore/java/android/security/KeyChain.java
+++ b/keystore/java/android/security/KeyChain.java
@@ -17,6 +17,7 @@
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.annotation.WorkerThread;
 import android.app.Activity;
 import android.app.PendingIntent;
 import android.content.ComponentName;
@@ -351,11 +352,15 @@
      * Returns the {@code PrivateKey} for the requested alias, or null
      * if no there is no result.
      *
-     * @param alias The alias of the desired private key, typically
-     * returned via {@link KeyChainAliasCallback#alias}.
+     * <p> This method may block while waiting for a connection to another process, and must never
+     * be called from the main thread.
+     *
+     * @param alias The alias of the desired private key, typically returned via
+     *              {@link KeyChainAliasCallback#alias}.
      * @throws KeyChainException if the alias was valid but there was some problem accessing it.
+     * @throws IllegalStateException if called from the main thread.
      */
-    @Nullable
+    @Nullable @WorkerThread
     public static PrivateKey getPrivateKey(@NonNull Context context, @NonNull String alias)
             throws KeyChainException, InterruptedException {
         if (alias == null) {
@@ -386,11 +391,15 @@
      * Returns the {@code X509Certificate} chain for the requested
      * alias, or null if no there is no result.
      *
+     * <p> This method may block while waiting for a connection to another process, and must never
+     * be called from the main thread.
+     *
      * @param alias The alias of the desired certificate chain, typically
      * returned via {@link KeyChainAliasCallback#alias}.
      * @throws KeyChainException if the alias was valid but there was some problem accessing it.
+     * @throws IllegalStateException if called from the main thread.
      */
-    @Nullable
+    @Nullable @WorkerThread
     public static X509Certificate[] getCertificateChain(@NonNull Context context,
             @NonNull String alias) throws KeyChainException, InterruptedException {
         if (alias == null) {
@@ -505,6 +514,7 @@
      *
      * Caller should call unbindService on the result when finished.
      */
+    @WorkerThread
     public static KeyChainConnection bind(@NonNull Context context) throws InterruptedException {
         return bindAsUser(context, Process.myUserHandle());
     }
@@ -512,6 +522,7 @@
     /**
      * @hide
      */
+    @WorkerThread
     public static KeyChainConnection bindAsUser(@NonNull Context context, UserHandle user)
             throws InterruptedException {
         if (context == null) {