AccountExternalIdInfo: Return null for boolean fields in case of false

This is to be consistent with how the values for other boolean fields
are returned.

Change-Id: I10365265fa477613bbf40b043655743d40d6eb3c
Signed-off-by: Edwin Kempin <ekempin@google.com>
diff --git a/Documentation/rest-api-accounts.txt b/Documentation/rest-api-accounts.txt
index 14c716d..bef9c97 100644
--- a/Documentation/rest-api-accounts.txt
+++ b/Documentation/rest-api-accounts.txt
@@ -1702,8 +1702,7 @@
     {
       "identity": "username:john",
       "email": "john.doe@example.com",
-      "trusted": true,
-      "can_delete": false
+      "trusted": true
     }
   ]
 ----
@@ -2142,9 +2141,10 @@
 |Field Name        ||Description
 |`identity`        ||The account external id.
 |`email`           |optional|The email address for the external id.
-|`trusted`         ||True if the external id is trusted.
-|`can_delete`      ||
-True if the external id can be deleted by the calling user.
+|`trusted`         |not set if `false`|
+Whether the external id is trusted.
+|`can_delete`      |not set if `false`|
+Whether the external id can be deleted by the calling user.
 |============================
 
 [[capability-info]]
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/AccountIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/AccountIT.java
index 60b86a0..ea074ad 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/AccountIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/AccountIT.java
@@ -758,8 +758,8 @@
         newGson().fromJson(response.getReader(),
             new TypeToken<List<AccountExternalIdInfo>>() {}.getType());
 
-    // 'canDelete' field will be all false. It will be better if we can find
-    // a way to test it. But it looks a little difficult.
+    // 'canDelete' field will be all null (false). It will be better if we can
+    // find a way to test it. But it looks a little difficult.
     externalIdInfoList.stream().sorted();
     assertThat(expectedIdInfoList)
         .containsExactlyElementsIn(expectedIdInfoList);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetExternalIds.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetExternalIds.java
index 215ef03..1eae4cf 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetExternalIds.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetExternalIds.java
@@ -66,22 +66,25 @@
       AccountExternalIdInfo info = new AccountExternalIdInfo();
       info.identity = id.getExternalId();
       info.emailAddress = id.getEmailAddress();
-      info.trusted = authConfig.isIdentityTrustable(
-          Collections.singleton(id));
+      info.trusted =
+          toBoolean(authConfig.isIdentityTrustable(Collections.singleton(id)));
       // The identity can be deleted only if its not the one used to
       // establish this web session, and if only if an identity was
       // actually used to establish this web session.
-      if (id.isScheme(SCHEME_USERNAME)) {
-        info.canDelete = false;
-      } else {
+      if (!id.isScheme(SCHEME_USERNAME)) {
         CurrentUser.PropertyKey<AccountExternalId.Key> k =
             CurrentUser.PropertyKey.create();
         AccountExternalId.Key last = resource.getUser().get(k);
-        info.canDelete = (last != null) && (!last.get().equals(info.identity));
+        info.canDelete =
+            toBoolean(last != null && !last.get().equals(info.identity));
       }
       result.add(info);
     }
     return result;
   }
+
+  private static Boolean toBoolean(boolean v) {
+    return v ? v : null;
+  }
 }