diff --git a/src/com/android/contacts/editor/ContactEditorUtils.java b/src/com/android/contacts/editor/ContactEditorUtils.java
index 105b885..93fa8a3 100644
--- a/src/com/android/contacts/editor/ContactEditorUtils.java
+++ b/src/com/android/contacts/editor/ContactEditorUtils.java
@@ -22,10 +22,10 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.SharedPreferences;
-import android.preference.PreferenceManager;
 import android.text.TextUtils;
 import android.util.Log;
 
+import com.android.contacts.common.R;
 import com.android.contacts.common.testing.NeededForTesting;
 import com.android.contacts.common.model.AccountTypeManager;
 import com.android.contacts.common.model.account.AccountType;
@@ -44,10 +44,7 @@
 public class ContactEditorUtils {
     private static final String TAG = "ContactEditorUtils";
 
-    private static final String KEY_DEFAULT_ACCOUNT = "ContactEditorUtils_default_account";
     private static final String KEY_KNOWN_ACCOUNTS = "ContactEditorUtils_known_accounts";
-    // Key to tell the first time launch.
-    private static final String KEY_ANYTHING_SAVED = "ContactEditorUtils_anything_saved";
 
     private static final List<AccountWithDataSet> EMPTY_ACCOUNTS = ImmutableList.of();
 
@@ -56,6 +53,9 @@
     private final Context mContext;
     private final SharedPreferences mPrefs;
     private final AccountTypeManager mAccountTypes;
+    private final String mDefaultAccountKey;
+    // Key to tell the first time launch.
+    private final String mAnythingSavedKey;
 
     private ContactEditorUtils(Context context) {
         this(context, AccountTypeManager.getInstance(context));
@@ -64,8 +64,12 @@
     @VisibleForTesting
     ContactEditorUtils(Context context, AccountTypeManager accountTypes) {
         mContext = context.getApplicationContext();
-        mPrefs = PreferenceManager.getDefaultSharedPreferences(mContext);
+        mPrefs = mContext.getSharedPreferences(context.getPackageName(), Context.MODE_PRIVATE);
         mAccountTypes = accountTypes;
+        mDefaultAccountKey = mContext.getResources().getString(
+                R.string.contact_editor_default_account_key);
+        mAnythingSavedKey = mContext.getResources().getString(
+                R.string.contact_editor_anything_saved_key);
     }
 
     public static synchronized ContactEditorUtils getInstance(Context context) {
@@ -77,21 +81,21 @@
 
     @NeededForTesting
     void cleanupForTest() {
-        mPrefs.edit().remove(KEY_DEFAULT_ACCOUNT).remove(KEY_KNOWN_ACCOUNTS)
-                .remove(KEY_ANYTHING_SAVED).apply();
+        mPrefs.edit().remove(mDefaultAccountKey).remove(KEY_KNOWN_ACCOUNTS)
+                .remove(mAnythingSavedKey).apply();
     }
 
     @NeededForTesting
     void removeDefaultAccountForTest() {
-        mPrefs.edit().remove(KEY_DEFAULT_ACCOUNT).apply();
+        mPrefs.edit().remove(mDefaultAccountKey).apply();
     }
 
     /**
-     * Sets the {@link #KEY_KNOWN_ACCOUNTS} and {@link #KEY_DEFAULT_ACCOUNT} preference values to
+     * Sets the {@link #KEY_KNOWN_ACCOUNTS} and {@link #mDefaultAccountKey} preference values to
      * empty strings to reset the state of the preferences file.
      */
     private void resetPreferenceValues() {
-        mPrefs.edit().putString(KEY_KNOWN_ACCOUNTS, "").putString(KEY_DEFAULT_ACCOUNT, "").apply();
+        mPrefs.edit().putString(KEY_KNOWN_ACCOUNTS, "").putString(mDefaultAccountKey, "").apply();
     }
 
     private List<AccountWithDataSet> getWritableAccounts() {
@@ -103,7 +107,7 @@
      *     been called.
      */
     private boolean isFirstLaunch() {
-        return !mPrefs.getBoolean(KEY_ANYTHING_SAVED, false);
+        return !mPrefs.getBoolean(mAnythingSavedKey, false);
     }
 
     /**
@@ -117,19 +121,19 @@
      */
     public void saveDefaultAndAllAccounts(AccountWithDataSet defaultAccount) {
         final SharedPreferences.Editor editor = mPrefs.edit()
-                .putBoolean(KEY_ANYTHING_SAVED, true);
+                .putBoolean(mAnythingSavedKey, true);
 
         if (defaultAccount == null || defaultAccount.isLocalAccount()) {
             // If the default is "local only", there should be no writable accounts.
             // This should always be the case with our spec, but because we load the account list
             // asynchronously using a worker thread, it is possible that there are accounts at this
             // point. So if the default is null always clear the account list.
-            editor.putString(KEY_KNOWN_ACCOUNTS, "");
-            editor.putString(KEY_DEFAULT_ACCOUNT, "");
+            editor.remove(KEY_KNOWN_ACCOUNTS);
+            editor.remove(mDefaultAccountKey);
         } else {
             editor.putString(KEY_KNOWN_ACCOUNTS,
                     AccountWithDataSet.stringifyList(getWritableAccounts()));
-            editor.putString(KEY_DEFAULT_ACCOUNT, defaultAccount.stringify());
+            editor.putString(mDefaultAccountKey, defaultAccount.stringify());
         }
         editor.apply();
     }
@@ -144,7 +148,7 @@
      * Also note that the returned account may have been removed already.
      */
     public AccountWithDataSet getDefaultAccount() {
-        final String saved = mPrefs.getString(KEY_DEFAULT_ACCOUNT, null);
+        final String saved = mPrefs.getString(mDefaultAccountKey, null);
         if (TextUtils.isEmpty(saved)) {
             return null;
         }
@@ -194,7 +198,6 @@
     /**
      * @return true if the contact editor should show the "accounts changed" notification, that is:
      * - If it's the first launch.
-     * - Or, if an account has been added.
      * - Or, if the default account has been removed.
      * (And some extra sanity check)
      *
@@ -207,14 +210,7 @@
             return true;
         }
 
-        // Account added?
-        final List<AccountWithDataSet> savedAccounts = getSavedAccounts();
         final List<AccountWithDataSet> currentWritableAccounts = getWritableAccounts();
-        for (AccountWithDataSet account : currentWritableAccounts) {
-            if (!savedAccounts.contains(account)) {
-                return true; // New account found.
-            }
-        }
 
         final AccountWithDataSet defaultAccount = getDefaultAccount();
 
