AccountApi: Add methods to get and set GeneralPreferencesInfo

Add method AccountApi.getPreferences() and AccountApi.setPreferences()
to align the Java API with the Rest API. It is needed for the new
Android client. Use the new API methods in the acceptance tests.

Change-Id: Ie472f9d740ab0b2c878400250e687e4452f7d880
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/GeneralPreferencesIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/GeneralPreferencesIT.java
similarity index 87%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/GeneralPreferencesIT.java
rename to gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/GeneralPreferencesIT.java
index 7c601b1..337aa8e 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/GeneralPreferencesIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/GeneralPreferencesIT.java
@@ -12,12 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.acceptance.rest.account;
+package com.google.gerrit.acceptance.api.accounts;
 
 import static com.google.common.truth.Truth.assertThat;
 
 import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.acceptance.NoHttpd;
 import com.google.gerrit.acceptance.TestAccount;
 import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
 import com.google.gerrit.extensions.client.GeneralPreferencesInfo.DateFormat;
@@ -34,6 +34,7 @@
 import java.util.ArrayList;
 import java.util.HashMap;
 
+@NoHttpd
 public class GeneralPreferencesIT extends AbstractDaemonTest {
   private TestAccount user42;
 
@@ -44,20 +45,11 @@
   }
 
   @Test
-  public void getDiffPreferencesOfNonExistingAccount_NotFound()
-      throws Exception {
-    RestResponse r = adminSession.get("/accounts/non-existing/preferences");
-    r.assertNotFound();
-  }
-
-  @Test
   public void getAndSetPreferences() throws Exception {
-    RestResponse r = adminSession.get("/accounts/" + user42.email
-        + "/preferences");
-    r.assertOK();
+    GeneralPreferencesInfo o = gApi.accounts()
+        .id(user42.id.toString())
+        .getPreferences();
     GeneralPreferencesInfo d = GeneralPreferencesInfo.defaults();
-    GeneralPreferencesInfo o =
-        newGson().fromJson(r.getReader(), GeneralPreferencesInfo.class);
 
     assertThat(o.changesPerPage).isEqualTo(d.changesPerPage);
     assertThat(o.showSiteHeader).isEqualTo(d.showSiteHeader);
@@ -102,9 +94,9 @@
     i.urlAliases = new HashMap<>();
     i.urlAliases.put("foo", "bar");
 
-    r = adminSession.put("/accounts/" + user42.email + "/preferences", i);
-    r.assertOK();
-    o = newGson().fromJson(r.getReader(), GeneralPreferencesInfo.class);
+    o = gApi.accounts()
+        .id(user42.getId().toString())
+        .setPreferences(i);
 
     assertThat(o.changesPerPage).isEqualTo(i.changesPerPage);
     assertThat(o.showSiteHeader).isNull();
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/AccountApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/AccountApi.java
index 7a7c4d1..4ebe0d3 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/AccountApi.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/AccountApi.java
@@ -14,6 +14,7 @@
 
 package com.google.gerrit.extensions.api.accounts;
 
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
 import com.google.gerrit.extensions.common.AccountInfo;
 import com.google.gerrit.extensions.common.GpgKeyInfo;
 import com.google.gerrit.extensions.restapi.NotImplementedException;
@@ -26,6 +27,11 @@
   AccountInfo get() throws RestApiException;
 
   String getAvatarUrl(int size) throws RestApiException;
+
+  GeneralPreferencesInfo getPreferences() throws RestApiException;
+  GeneralPreferencesInfo setPreferences(GeneralPreferencesInfo in)
+      throws RestApiException;
+
   void starChange(String id) throws RestApiException;
   void unstarChange(String id) throws RestApiException;
   void addEmail(EmailInput input) throws RestApiException;
@@ -51,6 +57,17 @@
     }
 
     @Override
+    public GeneralPreferencesInfo getPreferences() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public GeneralPreferencesInfo setPreferences(GeneralPreferencesInfo in)
+        throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
     public void starChange(String id) throws RestApiException {
       throw new NotImplementedException();
     }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountApiImpl.java
index 0a68998..bff5b69 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountApiImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountApiImpl.java
@@ -18,6 +18,7 @@
 import com.google.gerrit.extensions.api.accounts.AccountApi;
 import com.google.gerrit.extensions.api.accounts.EmailInput;
 import com.google.gerrit.extensions.api.accounts.GpgKeyApi;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
 import com.google.gerrit.extensions.common.AccountInfo;
 import com.google.gerrit.extensions.common.GpgKeyInfo;
 import com.google.gerrit.extensions.restapi.IdString;
@@ -28,6 +29,8 @@
 import com.google.gerrit.server.account.AccountResource;
 import com.google.gerrit.server.account.CreateEmail;
 import com.google.gerrit.server.account.GetAvatar;
+import com.google.gerrit.server.account.GetPreferences;
+import com.google.gerrit.server.account.SetPreferences;
 import com.google.gerrit.server.account.StarredChanges;
 import com.google.gerrit.server.change.ChangeResource;
 import com.google.gerrit.server.change.ChangesCollection;
@@ -36,6 +39,9 @@
 import com.google.inject.Provider;
 import com.google.inject.assistedinject.Assisted;
 
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+import java.io.IOException;
 import java.util.List;
 import java.util.Map;
 
@@ -48,6 +54,8 @@
   private final ChangesCollection changes;
   private final AccountLoader.Factory accountLoaderFactory;
   private final Provider<GetAvatar> getAvatar;
+  private final GetPreferences getPreferences;
+  private final SetPreferences setPreferences;
   private final StarredChanges.Create starredChangesCreate;
   private final StarredChanges.Delete starredChangesDelete;
   private final CreateEmail.Factory createEmailFactory;
@@ -57,6 +65,8 @@
   AccountApiImpl(AccountLoader.Factory ailf,
       ChangesCollection changes,
       Provider<GetAvatar> getAvatar,
+      GetPreferences getPreferences,
+      SetPreferences setPreferences,
       StarredChanges.Create starredChangesCreate,
       StarredChanges.Delete starredChangesDelete,
       CreateEmail.Factory createEmailFactory,
@@ -66,6 +76,8 @@
     this.accountLoaderFactory = ailf;
     this.changes = changes;
     this.getAvatar = getAvatar;
+    this.getPreferences = getPreferences;
+    this.setPreferences = setPreferences;
     this.starredChangesCreate = starredChangesCreate;
     this.starredChangesDelete = starredChangesDelete;
     this.createEmailFactory = createEmailFactory;
@@ -93,6 +105,21 @@
   }
 
   @Override
+  public GeneralPreferencesInfo getPreferences() throws RestApiException {
+    return getPreferences.apply(account);
+  }
+
+  @Override
+  public GeneralPreferencesInfo setPreferences(GeneralPreferencesInfo in)
+      throws RestApiException {
+    try {
+      return setPreferences.apply(account, in);
+    } catch (IOException | ConfigInvalidException e) {
+      throw new RestApiException("Cannot set preferences", e);
+    }
+  }
+
+  @Override
   public void starChange(String id) throws RestApiException {
     try {
       ChangeResource rsrc = changes.parse(