diff --git a/java-overridable/src/com/android/inputmethod/latin/accounts/LoginAccountUtils.java b/java-overridable/src/com/android/inputmethod/latin/accounts/LoginAccountUtils.java
index 70f152a..e07a9f3 100644
--- a/java-overridable/src/com/android/inputmethod/latin/accounts/LoginAccountUtils.java
+++ b/java-overridable/src/com/android/inputmethod/latin/accounts/LoginAccountUtils.java
@@ -16,16 +16,20 @@
 
 package com.android.inputmethod.latin.accounts;
 
-import android.accounts.Account;
 import android.content.Context;
 
 import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
 
 /**
  * Utility class for retrieving accounts that may be used for login.
  */
 public class LoginAccountUtils {
+    /**
+     * This defines the type of account this class deals with.
+     * This account type is used when listing the accounts available on the device for login.
+     */
+    public static final String ACCOUNT_TYPE = "";
+
     private LoginAccountUtils() {
         // This utility class is not publicly instantiable.
     }
@@ -39,9 +43,4 @@
     public static String[] getAccountsForLogin(final Context context) {
         return new String[0];
     }
-
-    @Nullable
-    public static Account getCurrentAccount(final Context context) {
-        return null;
-    }
 }
diff --git a/java/src/com/android/inputmethod/latin/settings/AccountsSettingsFragment.java b/java/src/com/android/inputmethod/latin/settings/AccountsSettingsFragment.java
index c382426..5e6521f 100644
--- a/java/src/com/android/inputmethod/latin/settings/AccountsSettingsFragment.java
+++ b/java/src/com/android/inputmethod/latin/settings/AccountsSettingsFragment.java
@@ -101,7 +101,7 @@
     @Override
     public void onResume() {
         super.onResume();
-        refreshAccountAndDependentPreferences(getCurrentlySelectedAccount());
+        refreshAccountAndDependentPreferences(getSignedInAccountName());
     }
 
     @Override
@@ -111,7 +111,7 @@
                     prefs.getString(PREF_ACCOUNT_NAME, null));
         } else if (TextUtils.equals(key, PREF_ENABLE_CLOUD_SYNC)) {
             final boolean syncEnabled = prefs.getBoolean(PREF_ENABLE_CLOUD_SYNC, false);
-            updateSyncPolicy(syncEnabled, LoginAccountUtils.getCurrentAccount(getActivity()));
+            updateSyncPolicy(syncEnabled, getSignedInAccountName());
         }
     }
 
@@ -182,16 +182,22 @@
      * set or unset the syncable property of the sync authority.
      * If the account is null, this method is a no-op currently, but we may want
      * to perform some cleanup in the future.
+     *
+     * @param enabled indicates whether the sync preference is enabled or not.
+     * @param accountToUse indicaes the account to be used for sync, or null if the user
+     *        is not logged in.
      */
     @UsedForTesting
-    void updateSyncPolicy(boolean enabled, Account accountToUse) {
+    void updateSyncPolicy(boolean enabled, @Nullable String accountToUse) {
         if (!ProductionFlags.ENABLE_PERSONAL_DICTIONARY_SYNC) {
             return;
         }
 
         if (accountToUse != null) {
             final int syncable = enabled ? 1 : 0;
-            ContentResolver.setIsSyncable(accountToUse, AUTHORITY, syncable);
+            ContentResolver.setIsSyncable(
+                    new Account(accountToUse, LoginAccountUtils.ACCOUNT_TYPE),
+                    AUTHORITY, syncable);
             // TODO: Also add a periodic sync here.
             // See ContentResolver.addPeriodicSync
         } else {
@@ -202,11 +208,11 @@
     }
 
     @Nullable
-    private String getCurrentlySelectedAccount() {
+    String getSignedInAccountName() {
         return getSharedPreferences().getString(LocalSettingsConstants.PREF_ACCOUNT_NAME, null);
     }
 
-    private boolean isSyncEnabled() {
+    boolean isSyncEnabled() {
         return getSharedPreferences().getBoolean(PREF_ENABLE_CLOUD_SYNC, false);
     }
 
@@ -266,12 +272,11 @@
                     // Attempt starting sync for the new account if sync was
                     // previously enabled.
                     // If not, stop it.
-                    updateSyncPolicy(isSyncEnabled(),
-                            LoginAccountUtils.getCurrentAccount(getActivity()));
+                    updateSyncPolicy(isSyncEnabled(), getSignedInAccountName());
                     break;
                 case DialogInterface.BUTTON_NEUTRAL: // Signed out
                     // Stop sync for the account that's being signed out of.
-                    updateSyncPolicy(false, LoginAccountUtils.getCurrentAccount(getActivity()));
+                    updateSyncPolicy(false, getSignedInAccountName());
                     getSharedPreferences()
                             .edit()
                             .remove(PREF_ACCOUNT_NAME)
@@ -288,7 +293,8 @@
         @Override
         public boolean onPreferenceClick(final Preference preference) {
             ContentResolver.requestSync(
-                    LoginAccountUtils.getCurrentAccount(getActivity()), AUTHORITY, Bundle.EMPTY);
+                    new Account(getSignedInAccountName(), LoginAccountUtils.ACCOUNT_TYPE),
+                    AUTHORITY, Bundle.EMPTY);
             return true;
         }
     }
diff --git a/tests/src/com/android/inputmethod/latin/settings/AccountsSettingsFragmentTests.java b/tests/src/com/android/inputmethod/latin/settings/AccountsSettingsFragmentTests.java
index a0b2c22..273d7fa 100644
--- a/tests/src/com/android/inputmethod/latin/settings/AccountsSettingsFragmentTests.java
+++ b/tests/src/com/android/inputmethod/latin/settings/AccountsSettingsFragmentTests.java
@@ -28,6 +28,7 @@
 import android.view.View;
 import android.widget.ListView;
 
+import com.android.inputmethod.latin.accounts.LoginAccountUtils;
 import com.android.inputmethod.latin.define.ProductionFlags;
 
 import java.util.concurrent.CountDownLatch;
@@ -38,7 +39,9 @@
         extends ActivityInstrumentationTestCase2<TestFragmentActivity> {
     private static final String FRAG_NAME = AccountsSettingsFragment.class.getName();
     private static final long TEST_TIMEOUT_MILLIS = 5000;
-    private static final Account TEST_ACCOUNT = new Account("account-for-test", "account-type");
+    private static final String TEST_ACCOUNT_NAME = "AccountsSettingsFragmentTests";
+    private static final Account TEST_ACCOUNT =
+            new Account(TEST_ACCOUNT_NAME, LoginAccountUtils.ACCOUNT_TYPE);
 
     private AlertDialog mDialog;
 
@@ -154,7 +157,7 @@
 
         final AccountsSettingsFragment fragment =
                 (AccountsSettingsFragment) getActivity().mFragment;
-        fragment.updateSyncPolicy(true, TEST_ACCOUNT);
+        fragment.updateSyncPolicy(true, TEST_ACCOUNT_NAME);
 
         // Should be syncable now.
         assertEquals(1, ContentResolver.getIsSyncable(TEST_ACCOUNT, AUTHORITY));
@@ -170,7 +173,7 @@
 
         final AccountsSettingsFragment fragment =
                 (AccountsSettingsFragment) getActivity().mFragment;
-        fragment.updateSyncPolicy(false, TEST_ACCOUNT);
+        fragment.updateSyncPolicy(false, TEST_ACCOUNT_NAME);
 
         // Should not be syncable now.
         assertEquals(0, ContentResolver.getIsSyncable(TEST_ACCOUNT, AUTHORITY));
@@ -186,12 +189,12 @@
 
         final AccountsSettingsFragment fragment =
                 (AccountsSettingsFragment) getActivity().mFragment;
-        fragment.updateSyncPolicy(true, TEST_ACCOUNT);
+        fragment.updateSyncPolicy(true, TEST_ACCOUNT_NAME);
 
         // Should be syncable now.
         assertEquals(1, ContentResolver.getIsSyncable(TEST_ACCOUNT, AUTHORITY));
 
-        fragment.updateSyncPolicy(false, TEST_ACCOUNT);
+        fragment.updateSyncPolicy(false, TEST_ACCOUNT_NAME);
 
         // Should not be syncable now.
         assertEquals(0, ContentResolver.getIsSyncable(TEST_ACCOUNT, AUTHORITY));
