Reload groups and filters when provider status changes

And avoid showing "Create new..." when no group-writable accounts
are available.

Bug 29450322
Bug 28842403

Change-Id: Iac024b1a23e317930b6ac6ceaa175e50a2dd7d84
diff --git a/src/com/android/contacts/ContactsDrawerActivity.java b/src/com/android/contacts/ContactsDrawerActivity.java
index 62a9258..888db49 100644
--- a/src/com/android/contacts/ContactsDrawerActivity.java
+++ b/src/com/android/contacts/ContactsDrawerActivity.java
@@ -125,7 +125,11 @@
             menu.removeItem(R.id.nav_help);
         }
 
-        // Set up fragment manager to load groups and filters.
+        loadGroupsAndFilters();
+    }
+
+    // Set up fragment manager to load groups and filters.
+    protected void loadGroupsAndFilters() {
         final FragmentManager fragmentManager = getFragmentManager();
         final FragmentTransaction transaction = fragmentManager.beginTransaction();
         addGroupsAndFiltersFragments(transaction);
@@ -191,6 +195,11 @@
             }
         }
 
+        // Don't show "Create new..." menu if there's no group-writable accounts available.
+        if (!ContactsUtils.areGroupWritableAccountsAvailable(this)) {
+            return;
+        }
+
         // Create a menu item in the sub menu to add new groups
         final MenuItem menuItem = subMenu.add(R.id.nav_groups_items, Menu.NONE, Menu.NONE,
                 getString(R.string.menu_new_group_action_bar));
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index d5c5b9b..9ac7152 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -21,12 +21,9 @@
 import android.app.FragmentTransaction;
 import android.content.ActivityNotFoundException;
 import android.content.ContentUris;
-import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
-import android.graphics.Color;
-import android.graphics.PorterDuff;
 import android.graphics.Rect;
 import android.net.Uri;
 import android.os.Bundle;
@@ -34,15 +31,10 @@
 import android.provider.ContactsContract.Contacts;
 import android.provider.ContactsContract.ProviderStatus;
 import android.provider.ContactsContract.QuickContact;
-import android.support.design.widget.NavigationView;
 import android.support.v13.app.FragmentPagerAdapter;
 import android.support.v4.view.GravityCompat;
 import android.support.v4.view.PagerAdapter;
 import android.support.v4.view.ViewPager;
-import android.support.v4.widget.DrawerLayout;
-import android.support.v7.app.AppCompatActivity;
-import android.support.v7.widget.Toolbar;
-import android.telecom.TelecomManager;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.KeyCharacterMap;
@@ -60,11 +52,7 @@
 import com.android.contacts.ContactsDrawerActivity;
 import com.android.contacts.R;
 import com.android.contacts.activities.ActionBarAdapter.TabState;
-import com.android.contacts.common.ContactsUtils;
 import com.android.contacts.common.activity.RequestPermissionsActivity;
-import com.android.contacts.common.compat.BlockedNumberContractCompat;
-import com.android.contacts.common.compat.CompatUtils;
-import com.android.contacts.common.compat.TelecomManagerUtil;
 import com.android.contacts.common.interactions.ImportExportDialogFragment;
 import com.android.contacts.common.list.ContactEntryListFragment;
 import com.android.contacts.common.list.ContactListFilter;
@@ -78,16 +66,10 @@
 import com.android.contacts.common.logging.ScreenEvent.ScreenType;
 import com.android.contacts.common.model.AccountTypeManager;
 import com.android.contacts.common.model.account.AccountWithDataSet;
-import com.android.contacts.common.util.AccountFilterUtil;
 import com.android.contacts.common.util.Constants;
 import com.android.contacts.common.util.ImplicitIntentsUtil;
 import com.android.contacts.common.widget.FloatingActionButtonController;
-import com.android.contacts.editor.ContactEditorFragment;
 import com.android.contacts.editor.EditorIntents;
-import com.android.contacts.group.GroupListItem;
-import com.android.contacts.group.GroupUtil;
-import com.android.contacts.group.GroupsFragment;
-import com.android.contacts.interactions.AccountFiltersFragment;
 import com.android.contacts.interactions.ContactDeletionInteraction;
 import com.android.contacts.interactions.ContactMultiDeletionInteraction;
 import com.android.contacts.interactions.ContactMultiDeletionInteraction.MultiContactDeleteListener;
@@ -100,9 +82,6 @@
 import com.android.contacts.list.OnContactsUnavailableActionListener;
 import com.android.contacts.quickcontact.QuickContactActivity;
 import com.android.contacts.util.DialogManager;
-import com.android.contacts.util.PhoneCapabilityTester;
-import com.android.contactsbind.Assistants;
-import com.android.contactsbind.HelpUtils;
 
 import java.util.List;
 import java.util.Locale;
@@ -879,9 +858,24 @@
 
     @Override
     public void onProviderStatusChange() {
+        reloadGroupsAndFiltersIfNeeded();
         updateViewConfiguration(false);
     }
 
+    private void reloadGroupsAndFiltersIfNeeded() {
+        final int providerStatus = mProviderStatusWatcher.getProviderStatus();
+        final Menu menu = mNavigationView.getMenu();
+        final MenuItem groupsMenuItem = menu.findItem(R.id.nav_groups);
+        final SubMenu subMenu = groupsMenuItem.getSubMenu();
+
+        // Reload groups and filters if provider status changes to "normal" and there's no groups
+        // loaded or just a "Create new..." menu item is in the menu.
+        if (subMenu != null && subMenu.size() <= 1 && providerStatus == ProviderStatus.STATUS_NORMAL
+                && !mProviderStatus.equals(providerStatus)) {
+            loadGroupsAndFilters();
+        }
+    }
+
     private void updateViewConfiguration(boolean forceUpdate) {
         int providerStatus = mProviderStatusWatcher.getProviderStatus();
         if (!forceUpdate && (mProviderStatus != null)