Show "add account" dialog when it needs to appear

Don't show the dialog if the only account is not a device account.
Set the default to be the only account if it is *not* a device
account.

Test:
Manually checked:
  * Removing only account and attempting to create a new account shows
    dialog
  * Clearing preferences shows dialog
  * If dialog was canceled, verify dialog doesn't appear anymore.
  * After adding a google account, (and without manually setting default)
    verified adding a new contact did not show a dialog and the default was
    automatically set to the only account on device.
  * Having two accounts and no default shows the pick default account dialog
  * Removing multiple accounts still has the same behavior as bullet 1

Bug:32555078
Change-Id: Iec664efca7e886d7376cd2aae7c5b2bdad3a8b84
diff --git a/src/com/android/contacts/common/preference/ContactsPreferences.java b/src/com/android/contacts/common/preference/ContactsPreferences.java
index 8865e91..ac7b0e0 100644
--- a/src/com/android/contacts/common/preference/ContactsPreferences.java
+++ b/src/com/android/contacts/common/preference/ContactsPreferences.java
@@ -16,13 +16,10 @@
 
 package com.android.contacts.common.preference;
 
-import android.content.ContentResolver;
 import android.content.Context;
 import android.content.SharedPreferences;
 import android.content.SharedPreferences.Editor;
 import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
-import android.net.Uri;
-import android.os.Bundle;
 import android.os.Handler;
 import android.os.Looper;
 import android.preference.PreferenceManager;
@@ -219,7 +216,8 @@
             return defaultAccount == null || !defaultAccount.isNullAccount();
         }
 
-        if (currentWritableAccounts.size() == 1) {
+        if (currentWritableAccounts.size() == 1
+                && !currentWritableAccounts.get(0).isNullAccount()) {
             return false;
         }
 
diff --git a/src/com/android/contacts/editor/ContactEditorFragment.java b/src/com/android/contacts/editor/ContactEditorFragment.java
index 65c30e8..42ef513 100644
--- a/src/com/android/contacts/editor/ContactEditorFragment.java
+++ b/src/com/android/contacts/editor/ContactEditorFragment.java
@@ -987,6 +987,9 @@
             mStatus = Status.SUB_ACTIVITY;
             startActivityForResult(intent, REQUEST_CODE_ACCOUNTS_CHANGED);
         } else {
+            // Make sure the default account is automatically set if there is only one non-device
+            // account.
+            mEditorUtils.maybeUpdateDefaultAccount();
             // Otherwise, there should be a default account. Then either create a local contact
             // (if default account is null) or create a contact with the specified account.
             AccountWithDataSet defaultAccount = mEditorUtils.getOnlyOrDefaultAccount();
diff --git a/src/com/android/contacts/editor/ContactEditorUtils.java b/src/com/android/contacts/editor/ContactEditorUtils.java
index fc1a887..5b80b04 100644
--- a/src/com/android/contacts/editor/ContactEditorUtils.java
+++ b/src/com/android/contacts/editor/ContactEditorUtils.java
@@ -132,6 +132,20 @@
         return mContactsPrefs.shouldShowAccountChangedNotification(getWritableAccounts());
     }
 
+    /**
+     * Sets the only non-device account to be default if it is not already.
+     */
+    public void maybeUpdateDefaultAccount() {
+        final List<AccountWithDataSet> currentWritableAccounts = getWritableAccounts();
+        if (currentWritableAccounts.size() == 1) {
+            final AccountWithDataSet onlyAccount = currentWritableAccounts.get(0);
+            if (!onlyAccount.isNullAccount()
+                    && !onlyAccount.equals(mContactsPrefs.getDefaultAccount())) {
+                mContactsPrefs.setDefaultAccount(onlyAccount);
+            }
+        }
+    }
+
     @VisibleForTesting
     String[] getWritableAccountTypeStrings() {
         final Set<String> types = Sets.newHashSet();