Removing Settings menu item in Asian locales

Bug: 3151551
Change-Id: I9a63499253979b8d18252aae3fe173e6342ba2cd
diff --git a/src/com/android/contacts/activities/ContactBrowserActivity.java b/src/com/android/contacts/activities/ContactBrowserActivity.java
index 5e74f49..95bf872 100644
--- a/src/com/android/contacts/activities/ContactBrowserActivity.java
+++ b/src/com/android/contacts/activities/ContactBrowserActivity.java
@@ -724,6 +724,9 @@
             return false;
         }
 
+        MenuItem settings = menu.findItem(R.id.menu_settings);
+        settings.setVisible(!ContactsPreferenceActivity.isEmpty(this));
+
         MenuItem displayGroups = menu.findItem(R.id.menu_display_groups);
         if (displayGroups != null) {
             displayGroups.setVisible(
diff --git a/src/com/android/contacts/preference/ContactsPreferenceActivity.java b/src/com/android/contacts/preference/ContactsPreferenceActivity.java
index eb65b72..d4b0ab0 100644
--- a/src/com/android/contacts/preference/ContactsPreferenceActivity.java
+++ b/src/com/android/contacts/preference/ContactsPreferenceActivity.java
@@ -16,75 +16,17 @@
 
 package com.android.contacts.preference;
 
-import com.android.contacts.ContactsSearchManager;
 import com.android.contacts.R;
-import com.android.contacts.model.AccountType;
-import com.android.contacts.model.EntityDelta.ValuesDelta;
-import com.android.contacts.model.GoogleAccountType;
-import com.android.contacts.model.AccountTypes;
-import com.android.contacts.util.EmptyService;
-import com.android.contacts.util.LocalizedNameResolver;
-import com.android.contacts.util.WeakAsyncTask;
-import com.google.android.collect.Lists;
 
-import android.accounts.Account;
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.app.ExpandableListActivity;
-import android.app.ProgressDialog;
-import android.content.ContentProviderOperation;
-import android.content.ContentProviderOperation.Builder;
-import android.content.ContentResolver;
-import android.content.ContentValues;
 import android.content.Context;
-import android.content.DialogInterface;
-import android.content.EntityIterator;
-import android.content.Intent;
-import android.content.OperationApplicationException;
-import android.content.SharedPreferences;
-import android.content.SharedPreferences.Editor;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.RemoteException;
 import android.preference.PreferenceActivity;
-import android.preference.PreferenceActivity.Header;
-import android.preference.PreferenceManager;
-import android.provider.ContactsContract;
-import android.provider.ContactsContract.Groups;
-import android.provider.ContactsContract.Settings;
-import android.util.Log;
-import android.view.ContextMenu;
-import android.view.LayoutInflater;
-import android.view.MenuItem;
-import android.view.MenuItem.OnMenuItemClickListener;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.BaseExpandableListAdapter;
-import android.widget.CheckBox;
-import android.widget.ExpandableListAdapter;
-import android.widget.ExpandableListView;
-import android.widget.ExpandableListView.ExpandableListContextMenuInfo;
-import android.widget.ListView;
-import android.widget.TextView;
 
-import java.lang.ref.WeakReference;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
 import java.util.List;
 
 /**
  * Contacts settings.
  */
-public final class ContactsPreferenceActivity extends PreferenceActivity
-//implements
-//        AdapterView.OnItemClickListener, View.OnClickListener
-        {
-    private static final String TAG = "ContactsSettingsActivity";
+public final class ContactsPreferenceActivity extends PreferenceActivity {
 
     /**
      * Populate the activity with the top-level headers.
@@ -94,1007 +36,12 @@
         loadHeadersFromResource(R.xml.preference_headers, target);
     }
 
-
-//    public interface Prefs {
-//        public static final String DISPLAY_ONLY_PHONES = "only_phones";
-//        public static final boolean DISPLAY_ONLY_PHONES_DEFAULT = false;
-//
-//    }
-//
-//    private static final int DIALOG_SORT_ORDER = 1;
-//    private static final int DIALOG_DISPLAY_ORDER = 2;
-//
-//    private ExpandableListView mList;
-//    private DisplayAdapter mAdapter;
-//
-//    private SharedPreferences mPrefs;
-//    private ContactsPreferences mContactsPrefs;
-//
-//    private CheckBox mDisplayPhones;
-//
-//    private View mHeaderPhones;
-//    private View mHeaderSeparator;
-//
-//    private View mSortOrderView;
-//    private TextView mSortOrderTextView;
-//    private int mSortOrder;
-//
-//    private View mDisplayOrderView;
-//    private TextView mDisplayOrderTextView;
-//    private int mDisplayOrder;
-//
-//    @Override
-//    protected void onCreate(Bundle icicle) {
-//        super.onCreate(icicle);
-//        setContentView(R.layout.contacts_preferences);
-//
-//        mList = getExpandableListView();
-//        mList.setHeaderDividersEnabled(true);
-//        mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
-//        mContactsPrefs = new ContactsPreferences(this);
-//        mAdapter = new DisplayAdapter(this);
-//
-//        final LayoutInflater inflater = getLayoutInflater();
-//
-//        createWithPhonesOnlyPreferenceView(inflater);
-//        createSortOrderPreferenceView(inflater);
-//        createDisplayOrderPreferenceView(inflater);
-//        createDisplayGroupHeader(inflater);
-//
-//        findViewById(R.id.btn_done).setOnClickListener(this);
-//        findViewById(R.id.btn_discard).setOnClickListener(this);
-//
-//        // Catch clicks on the header views
-//        mList.setOnItemClickListener(this);
-//        mList.setOnCreateContextMenuListener(this);
-//
-//        mSortOrder = mContactsPrefs.getSortOrder();
-//        mDisplayOrder = mContactsPrefs.getDisplayOrder();
-//    }
-//
-//    private void createWithPhonesOnlyPreferenceView(LayoutInflater inflater) {
-//        // Add the "Only contacts with phones" header modifier.
-//        mHeaderPhones = inflater.inflate(R.layout.display_options_phones_only, mList, false);
-//        mHeaderPhones.setId(R.id.header_phones);
-//        mDisplayPhones = (CheckBox) mHeaderPhones.findViewById(android.R.id.checkbox);
-//        mDisplayPhones.setChecked(mPrefs.getBoolean(Prefs.DISPLAY_ONLY_PHONES,
-//                Prefs.DISPLAY_ONLY_PHONES_DEFAULT));
-//        {
-//            final TextView text1 = (TextView)mHeaderPhones.findViewById(android.R.id.text1);
-//            final TextView text2 = (TextView)mHeaderPhones.findViewById(android.R.id.text2);
-//            text1.setText(R.string.showFilterPhones);
-//            text2.setText(R.string.showFilterPhonesDescrip);
-//        }
-//    }
-//
-//    private void createSortOrderPreferenceView(LayoutInflater inflater) {
-//        mSortOrderView = inflater.inflate(R.layout.preference_with_more_button, mList, false);
-//
-//        View preferenceLayout = mSortOrderView.findViewById(R.id.preference);
-//
-//        TextView label = (TextView)preferenceLayout.findViewById(R.id.label);
-//        label.setText(getString(R.string.display_options_sort_list_by));
-//
-//        mSortOrderTextView = (TextView)preferenceLayout.findViewById(R.id.data);
-//    }
-//
-//    private void createDisplayOrderPreferenceView(LayoutInflater inflater) {
-//        mDisplayOrderView = inflater.inflate(R.layout.preference_with_more_button, mList, false);
-//        View preferenceLayout = mDisplayOrderView.findViewById(R.id.preference);
-//
-//        TextView label = (TextView)preferenceLayout.findViewById(R.id.label);
-//        label.setText(getString(R.string.display_options_view_names_as));
-//
-//        mDisplayOrderTextView = (TextView)preferenceLayout.findViewById(R.id.data);
-//    }
-//
-//    private void createDisplayGroupHeader(LayoutInflater inflater) {
-//        // Add the separator before showing the detailed group list.
-//        mHeaderSeparator = inflater.inflate(R.layout.list_separator, mList, false);
-//        {
-//            final TextView text1 = (TextView)mHeaderSeparator;
-//            text1.setText(R.string.headerContactGroups);
-//        }
-//    }
-//
-//    @Override
-//    protected void onResume() {
-//        super.onResume();
-//        mList.removeHeaderView(mHeaderPhones);
-//        mList.removeHeaderView(mSortOrderView);
-//        mList.removeHeaderView(mDisplayOrderView);
-//        mList.removeHeaderView(mHeaderSeparator);
-//
-//        // List adapter needs to be reset, because header views cannot be added
-//        // to a list with an existing adapter.
-//        setListAdapter(null);
-//
-//        mList.addHeaderView(mHeaderPhones, null, true);
-//        if (mContactsPrefs.isSortOrderUserChangeable()) {
-//            mList.addHeaderView(mSortOrderView, null, true);
-//        }
-//
-//        if (mContactsPrefs.isSortOrderUserChangeable()) {
-//            mList.addHeaderView(mDisplayOrderView, null, true);
-//        }
-//
-//        mList.addHeaderView(mHeaderSeparator, null, false);
-//
-//        setListAdapter(mAdapter);
-//
-//        bindView();
-//
-//        // Start background query to find account details
-//        new QueryGroupsTask(this).execute();
-//    }
-//
-//    private void bindView() {
-//        mSortOrderTextView.setText(
-//                mSortOrder == ContactsContract.Preferences.SORT_ORDER_PRIMARY
-//                        ? getString(R.string.display_options_sort_by_given_name)
-//                        : getString(R.string.display_options_sort_by_family_name));
-//
-//        mDisplayOrderTextView.setText(
-//                mDisplayOrder == ContactsContract.Preferences.DISPLAY_ORDER_PRIMARY
-//                        ? getString(R.string.display_options_view_given_name_first)
-//                        : getString(R.string.display_options_view_family_name_first));
-//    }
-//
-//    @Override
-//    protected Dialog onCreateDialog(int id, Bundle args) {
-//        switch (id) {
-//            case DIALOG_SORT_ORDER:
-//                return createSortOrderDialog();
-//            case DIALOG_DISPLAY_ORDER:
-//                return createDisplayOrderDialog();
-//        }
-//
-//        return null;
-//    }
-//
-//    private Dialog createSortOrderDialog() {
-//        String[] items = new String[] {
-//                getString(R.string.display_options_sort_by_given_name),
-//                getString(R.string.display_options_sort_by_family_name),
-//        };
-//
-//        return new AlertDialog.Builder(this)
-//            .setIcon(com.android.internal.R.drawable.ic_dialog_menu_generic)
-//            .setTitle(R.string.display_options_sort_list_by)
-//            .setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {
-//                    public void onClick(DialogInterface dialog, int whichButton) {
-//                        setSortOrder(dialog);
-//                        dialog.dismiss();
-//                    }
-//                })
-//            .setNegativeButton(android.R.string.cancel, null)
-//            .create();
-//    }
-//
-//    private Dialog createDisplayOrderDialog() {
-//        String[] items = new String[] {
-//                getString(R.string.display_options_view_given_name_first),
-//                getString(R.string.display_options_view_family_name_first),
-//        };
-//
-//        return new AlertDialog.Builder(this)
-//            .setIcon(com.android.internal.R.drawable.ic_dialog_menu_generic)
-//            .setTitle(R.string.display_options_view_names_as)
-//            .setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {
-//                    public void onClick(DialogInterface dialog, int whichButton) {
-//                        setDisplayOrder(dialog);
-//                        dialog.dismiss();
-//                    }
-//                })
-//            .setNegativeButton(android.R.string.cancel, null)
-//            .create();
-//    }
-//
-//    @Override
-//    protected void onPrepareDialog(int id, Dialog dialog, Bundle args) {
-//        switch (id) {
-//            case DIALOG_SORT_ORDER:
-//                setCheckedItem(dialog,
-//                        mSortOrder == ContactsContract.Preferences.SORT_ORDER_PRIMARY ? 0 : 1);
-//                break;
-//            case DIALOG_DISPLAY_ORDER:
-//                setCheckedItem(dialog,
-//                        mDisplayOrder == ContactsContract.Preferences.DISPLAY_ORDER_PRIMARY
-//                                ? 0 : 1);
-//                break;
-//        }
-//    }
-//
-//    private void setCheckedItem(Dialog dialog, int position) {
-//        ListView listView = ((AlertDialog)dialog).getListView();
-//        listView.setItemChecked(position, true);
-//        listView.setSelection(position);
-//    }
-//
-//    protected void setSortOrder(DialogInterface dialog) {
-//        ListView listView = ((AlertDialog)dialog).getListView();
-//        int checked = listView.getCheckedItemPosition();
-//        mSortOrder = checked == 0
-//                ? ContactsContract.Preferences.SORT_ORDER_PRIMARY
-//                : ContactsContract.Preferences.SORT_ORDER_ALTERNATIVE;
-//
-//        bindView();
-//    }
-//
-//    protected void setDisplayOrder(DialogInterface dialog) {
-//        ListView listView = ((AlertDialog)dialog).getListView();
-//        int checked = listView.getCheckedItemPosition();
-//        mDisplayOrder = checked == 0
-//                ? ContactsContract.Preferences.DISPLAY_ORDER_PRIMARY
-//                : ContactsContract.Preferences.DISPLAY_ORDER_ALTERNATIVE;
-//
-//        bindView();
-//    }
-//
-//    /**
-//     * Background operation to build set of {@link AccountDisplay} for each
-//     * {@link AccountTypes#getAccounts(boolean)} that provides groups.
-//     */
-//    private static class QueryGroupsTask extends
-//            WeakAsyncTask<Void, Void, AccountSet, ContactsPreferenceActivity> {
-//        public QueryGroupsTask(ContactsPreferenceActivity target) {
-//            super(target);
-//        }
-//
-//        @Override
-//        protected AccountSet doInBackground(ContactsPreferenceActivity target,
-//                Void... params) {
-//            final Context context = target;
-//            final AccountTypes sources = AccountTypes.getInstance(context);
-//            final ContentResolver resolver = context.getContentResolver();
-//
-//            // Inflate groups entry for each account
-//            final AccountSet accounts = new AccountSet();
-//            for (Account account : sources.getAccounts(false)) {
-//                accounts.add(new AccountDisplay(resolver, account.name, account.type));
-//            }
-//
-//            return accounts;
-//        }
-//
-//        @Override
-//        protected void onPostExecute(ContactsPreferenceActivity target, AccountSet result) {
-//            target.mAdapter.setAccounts(result);
-//        }
-//    }
-//
-//    private static final int DEFAULT_SHOULD_SYNC = 1;
-//    private static final int DEFAULT_VISIBLE = 0;
-//
-//    /**
-//     * Entry holding any changes to {@link Groups} or {@link Settings} rows,
-//     * such as {@link Groups#SHOULD_SYNC} or {@link Groups#GROUP_VISIBLE}.
-//     */
-//    protected static class GroupDelta extends ValuesDelta {
-//        private boolean mUngrouped = false;
-//        private boolean mAccountHasGroups;
-//
-//        private GroupDelta() {
-//            super();
-//        }
-//
-//        /**
-//         * Build {@link GroupDelta} from the {@link Settings} row for the given
-//         * {@link Settings#ACCOUNT_NAME} and {@link Settings#ACCOUNT_TYPE}.
-//         */
-//        public static GroupDelta fromSettings(ContentResolver resolver, String accountName,
-//                String accountType, boolean accountHasGroups) {
-//            final Uri settingsUri = Settings.CONTENT_URI.buildUpon()
-//                    .appendQueryParameter(Settings.ACCOUNT_NAME, accountName)
-//                    .appendQueryParameter(Settings.ACCOUNT_TYPE, accountType).build();
-//            final Cursor cursor = resolver.query(settingsUri, new String[] {
-//                    Settings.SHOULD_SYNC, Settings.UNGROUPED_VISIBLE
-//            }, null, null, null);
-//
-//            try {
-//                final ContentValues values = new ContentValues();
-//                values.put(Settings.ACCOUNT_NAME, accountName);
-//                values.put(Settings.ACCOUNT_TYPE, accountType);
-//
-//                if (cursor != null && cursor.moveToFirst()) {
-//                    // Read existing values when present
-//                    values.put(Settings.SHOULD_SYNC, cursor.getInt(0));
-//                    values.put(Settings.UNGROUPED_VISIBLE, cursor.getInt(1));
-//                    return fromBefore(values).setUngrouped(accountHasGroups);
-//                } else {
-//                    // Nothing found, so treat as create
-//                    values.put(Settings.SHOULD_SYNC, DEFAULT_SHOULD_SYNC);
-//                    values.put(Settings.UNGROUPED_VISIBLE, DEFAULT_VISIBLE);
-//                    return fromAfter(values).setUngrouped(accountHasGroups);
-//                }
-//            } finally {
-//                if (cursor != null) cursor.close();
-//            }
-//        }
-//
-//        public static GroupDelta fromBefore(ContentValues before) {
-//            final GroupDelta entry = new GroupDelta();
-//            entry.mBefore = before;
-//            entry.mAfter = new ContentValues();
-//            return entry;
-//        }
-//
-//        public static GroupDelta fromAfter(ContentValues after) {
-//            final GroupDelta entry = new GroupDelta();
-//            entry.mBefore = null;
-//            entry.mAfter = after;
-//            return entry;
-//        }
-//
-//        protected GroupDelta setUngrouped(boolean accountHasGroups) {
-//            mUngrouped = true;
-//            mAccountHasGroups = accountHasGroups;
-//            return this;
-//        }
-//
-//        @Override
-//        public boolean beforeExists() {
-//            return mBefore != null;
-//        }
-//
-//        public boolean getShouldSync() {
-//            return getAsInteger(mUngrouped ? Settings.SHOULD_SYNC : Groups.SHOULD_SYNC,
-//                    DEFAULT_SHOULD_SYNC) != 0;
-//        }
-//
-//        public boolean getVisible() {
-//            return getAsInteger(mUngrouped ? Settings.UNGROUPED_VISIBLE : Groups.GROUP_VISIBLE,
-//                    DEFAULT_VISIBLE) != 0;
-//        }
-//
-//        public void putShouldSync(boolean shouldSync) {
-//            put(mUngrouped ? Settings.SHOULD_SYNC : Groups.SHOULD_SYNC, shouldSync ? 1 : 0);
-//        }
-//
-//        public void putVisible(boolean visible) {
-//            put(mUngrouped ? Settings.UNGROUPED_VISIBLE : Groups.GROUP_VISIBLE, visible ? 1 : 0);
-//        }
-//
-//        private String getAccountType() {
-//            return (mBefore == null ? mAfter : mBefore).getAsString(Settings.ACCOUNT_TYPE);
-//        }
-//
-//        public CharSequence getTitle(Context context) {
-//            if (mUngrouped) {
-//                final String customAllContactsName =
-//                        LocalizedNameResolver.getAllContactsName(context, getAccountType());
-//                if (customAllContactsName != null) {
-//                    return customAllContactsName;
-//                }
-//                if (mAccountHasGroups) {
-//                    return context.getText(R.string.display_ungrouped);
-//                } else {
-//                    return context.getText(R.string.display_all_contacts);
-//                }
-//            } else {
-//                final Integer titleRes = getAsInteger(Groups.TITLE_RES);
-//                if (titleRes != null) {
-//                    final String packageName = getAsString(Groups.RES_PACKAGE);
-//                    return context.getPackageManager().getText(packageName, titleRes, null);
-//                } else {
-//                    return getAsString(Groups.TITLE);
-//                }
-//            }
-//        }
-//
-//        /**
-//         * Build a possible {@link ContentProviderOperation} to persist any
-//         * changes to the {@link Groups} or {@link Settings} row described by
-//         * this {@link GroupDelta}.
-//         */
-//        public ContentProviderOperation buildDiff() {
-//            if (isNoop()) {
-//                return null;
-//            } else if (isUpdate()) {
-//                // When has changes and "before" exists, then "update"
-//                final Builder builder = ContentProviderOperation
-//                        .newUpdate(mUngrouped ? Settings.CONTENT_URI : addCallerIsSyncAdapterParameter(Groups.CONTENT_URI));
-//                if (mUngrouped) {
-//                    builder.withSelection(Settings.ACCOUNT_NAME + "=? AND " + Settings.ACCOUNT_TYPE
-//                            + "=?", new String[] {
-//                            this.getAsString(Settings.ACCOUNT_NAME),
-//                            this.getAsString(Settings.ACCOUNT_TYPE)
-//                    });
-//                } else {
-//                    builder.withSelection(Groups._ID + "=" + this.getId(), null);
-//                }
-//                builder.withValues(mAfter);
-//                return builder.build();
-//            } else if (isInsert() && mUngrouped) {
-//                // Only allow inserts for Settings
-//                mAfter.remove(mIdColumn);
-//                final Builder builder = ContentProviderOperation.newInsert(Settings.CONTENT_URI);
-//                builder.withValues(mAfter);
-//                return builder.build();
-//            } else {
-//                throw new IllegalStateException("Unexpected delete or insert");
-//            }
-//        }
-//    }
-//
-//    private static Uri addCallerIsSyncAdapterParameter(Uri uri) {
-//        return uri.buildUpon()
-//	        .appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true")
-//	        .build();
-//    }
-//
-//    /**
-//     * {@link Comparator} to sort by {@link Groups#_ID}.
-//     */
-//    private static Comparator<GroupDelta> sIdComparator = new Comparator<GroupDelta>() {
-//        public int compare(GroupDelta object1, GroupDelta object2) {
-//            final Long id1 = object1.getId();
-//            final Long id2 = object2.getId();
-//            if (id1 == null && id2 == null) {
-//                return 0;
-//            } else if (id1 == null) {
-//                return -1;
-//            } else if (id2 == null) {
-//                return 1;
-//            } else if (id1 < id2) {
-//                return -1;
-//            } else if (id1 > id2) {
-//                return 1;
-//            } else {
-//                return 0;
-//            }
-//        }
-//    };
-//
-//    /**
-//     * Set of all {@link AccountDisplay} entries, one for each source.
-//     */
-//    protected static class AccountSet extends ArrayList<AccountDisplay> {
-//        public ArrayList<ContentProviderOperation> buildDiff() {
-//            final ArrayList<ContentProviderOperation> diff = Lists.newArrayList();
-//            for (AccountDisplay account : this) {
-//                account.buildDiff(diff);
-//            }
-//            return diff;
-//        }
-//    }
-//
-//    /**
-//     * {@link GroupDelta} details for a single {@link Account}, usually shown as
-//     * children under a single expandable group.
-//     */
-//    protected static class AccountDisplay {
-//        public String mName;
-//        public String mType;
-//
-//        public GroupDelta mUngrouped;
-//        public ArrayList<GroupDelta> mSyncedGroups = Lists.newArrayList();
-//        public ArrayList<GroupDelta> mUnsyncedGroups = Lists.newArrayList();
-//
-//        /**
-//         * Build an {@link AccountDisplay} covering all {@link Groups} under the
-//         * given {@link Account}.
-//         */
-//        public AccountDisplay(ContentResolver resolver, String accountName, String accountType) {
-//            mName = accountName;
-//            mType = accountType;
-//
-//            final Uri groupsUri = Groups.CONTENT_URI.buildUpon()
-//                    .appendQueryParameter(Groups.ACCOUNT_NAME, accountName)
-//                    .appendQueryParameter(Groups.ACCOUNT_TYPE, accountType).build();
-//            EntityIterator iterator = ContactsContract.Groups.newEntityIterator(resolver.query(
-//                    groupsUri, null, null, null, null));
-//            try {
-//                boolean hasGroups = false;
-//
-//                // Create entries for each known group
-//                while (iterator.hasNext()) {
-//                    final ContentValues values = iterator.next().getEntityValues();
-//                    final GroupDelta group = GroupDelta.fromBefore(values);
-//                    addGroup(group);
-//                    hasGroups = true;
-//                }
-//                // Create single entry handling ungrouped status
-//                mUngrouped = GroupDelta.fromSettings(resolver, accountName, accountType, hasGroups);
-//                addGroup(mUngrouped);
-//            } finally {
-//                iterator.close();
-//            }
-//        }
-//
-//        /**
-//         * Add the given {@link GroupDelta} internally, filing based on its
-//         * {@link GroupDelta#getShouldSync()} status.
-//         */
-//        private void addGroup(GroupDelta group) {
-//            if (group.getShouldSync()) {
-//                mSyncedGroups.add(group);
-//            } else {
-//                mUnsyncedGroups.add(group);
-//            }
-//        }
-//
-//        /**
-//         * Set the {@link GroupDelta#putShouldSync(boolean)} value for all
-//         * children {@link GroupDelta} rows.
-//         */
-//        public void setShouldSync(boolean shouldSync) {
-//            final Iterator<GroupDelta> oppositeChildren = shouldSync ?
-//                    mUnsyncedGroups.iterator() : mSyncedGroups.iterator();
-//            while (oppositeChildren.hasNext()) {
-//                final GroupDelta child = oppositeChildren.next();
-//                setShouldSync(child, shouldSync, false);
-//                oppositeChildren.remove();
-//            }
-//        }
-//
-//        public void setShouldSync(GroupDelta child, boolean shouldSync) {
-//            setShouldSync(child, shouldSync, true);
-//        }
-//
-//        /**
-//         * Set {@link GroupDelta#putShouldSync(boolean)}, and file internally
-//         * based on updated state.
-//         */
-//        public void setShouldSync(GroupDelta child, boolean shouldSync, boolean attemptRemove) {
-//            child.putShouldSync(shouldSync);
-//            if (shouldSync) {
-//                if (attemptRemove) {
-//                    mUnsyncedGroups.remove(child);
-//                }
-//                mSyncedGroups.add(child);
-//                Collections.sort(mSyncedGroups, sIdComparator);
-//            } else {
-//                if (attemptRemove) {
-//                    mSyncedGroups.remove(child);
-//                }
-//                mUnsyncedGroups.add(child);
-//            }
-//        }
-//
-//        /**
-//         * Build set of {@link ContentProviderOperation} to persist any user
-//         * changes to {@link GroupDelta} rows under this {@link Account}.
-//         */
-//        public void buildDiff(ArrayList<ContentProviderOperation> diff) {
-//            for (GroupDelta group : mSyncedGroups) {
-//                final ContentProviderOperation oper = group.buildDiff();
-//                if (oper != null) diff.add(oper);
-//            }
-//            for (GroupDelta group : mUnsyncedGroups) {
-//                final ContentProviderOperation oper = group.buildDiff();
-//                if (oper != null) diff.add(oper);
-//            }
-//        }
-//    }
-//
-//    /**
-//     * {@link ExpandableListAdapter} that shows {@link GroupDelta} settings,
-//     * grouped by {@link Account} source. Shows footer row when any groups are
-//     * unsynced, as determined through {@link AccountDisplay#mUnsyncedGroups}.
-//     */
-//    protected static class DisplayAdapter extends BaseExpandableListAdapter {
-//        private Context mContext;
-//        private LayoutInflater mInflater;
-//        private AccountTypes mSources;
-//        private AccountSet mAccounts;
-//
-//        private boolean mChildWithPhones = false;
-//
-//        public DisplayAdapter(Context context) {
-//            mContext = context;
-//            mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-//            mSources = AccountTypes.getInstance(context);
-//        }
-//
-//        public void setAccounts(AccountSet accounts) {
-//            mAccounts = accounts;
-//            notifyDataSetChanged();
-//        }
-//
-//        /**
-//         * In group descriptions, show the number of contacts with phone
-//         * numbers, in addition to the total contacts.
-//         */
-//        public void setChildDescripWithPhones(boolean withPhones) {
-//            mChildWithPhones = withPhones;
-//        }
-//
-//        /** {@inheritDoc} */
-//        public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
-//                View convertView, ViewGroup parent) {
-//            if (convertView == null) {
-//                convertView = mInflater.inflate(R.layout.display_child, parent, false);
-//            }
-//
-//            final TextView text1 = (TextView)convertView.findViewById(android.R.id.text1);
-//            final TextView text2 = (TextView)convertView.findViewById(android.R.id.text2);
-//            final CheckBox checkbox = (CheckBox)convertView.findViewById(android.R.id.checkbox);
-//
-//            final AccountDisplay account = mAccounts.get(groupPosition);
-//            final GroupDelta child = (GroupDelta)this.getChild(groupPosition, childPosition);
-//            if (child != null) {
-//                // Handle normal group, with title and checkbox
-//                final boolean groupVisible = child.getVisible();
-//                checkbox.setVisibility(View.VISIBLE);
-//                checkbox.setChecked(groupVisible);
-//
-//                final CharSequence groupTitle = child.getTitle(mContext);
-//                text1.setText(groupTitle);
-//
-////              final int count = cursor.getInt(GroupsQuery.SUMMARY_COUNT);
-////              final int withPhones = cursor.getInt(GroupsQuery.SUMMARY_WITH_PHONES);
-//
-////              final CharSequence descrip = mContext.getResources().getQuantityString(
-////                      mChildWithPhones ? R.plurals.groupDescripPhones : R.plurals.groupDescrip,
-////                      count, count, withPhones);
-//
-////              text2.setText(descrip);
-//                text2.setVisibility(View.GONE);
-//            } else {
-//                // When unknown child, this is "more" footer view
-//                checkbox.setVisibility(View.GONE);
-//                text1.setText(R.string.display_more_groups);
-//                text2.setVisibility(View.GONE);
-//            }
-//
-//            return convertView;
-//        }
-//
-//        /** {@inheritDoc} */
-//        public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
-//                ViewGroup parent) {
-//            if (convertView == null) {
-//                convertView = mInflater.inflate(R.layout.display_group, parent, false);
-//            }
-//
-//            final TextView text1 = (TextView)convertView.findViewById(android.R.id.text1);
-//            final TextView text2 = (TextView)convertView.findViewById(android.R.id.text2);
-//
-//            final AccountDisplay account = (AccountDisplay)this.getGroup(groupPosition);
-//
-//            final BaseAccountType source = mSources.getInflatedSource(account.mType,
-//                    BaseAccountType.LEVEL_SUMMARY);
-//
-//            text1.setText(account.mName);
-//            text2.setText(source.getDisplayLabel(mContext));
-//            text2.setVisibility(account.mName == null ? View.GONE : View.VISIBLE);
-//
-//            return convertView;
-//        }
-//
-//        /** {@inheritDoc} */
-//        public Object getChild(int groupPosition, int childPosition) {
-//            final AccountDisplay account = mAccounts.get(groupPosition);
-//            final boolean validChild = childPosition >= 0
-//                    && childPosition < account.mSyncedGroups.size();
-//            if (validChild) {
-//                return account.mSyncedGroups.get(childPosition);
-//            } else {
-//                return null;
-//            }
-//        }
-//
-//        /** {@inheritDoc} */
-//        public long getChildId(int groupPosition, int childPosition) {
-//            final GroupDelta child = (GroupDelta)getChild(groupPosition, childPosition);
-//            if (child != null) {
-//                final Long childId = child.getId();
-//                return childId != null ? childId : Long.MIN_VALUE;
-//            } else {
-//                return Long.MIN_VALUE;
-//            }
-//        }
-//
-//        /** {@inheritDoc} */
-//        public int getChildrenCount(int groupPosition) {
-//            // Count is any synced groups, plus possible footer
-//            final AccountDisplay account = mAccounts.get(groupPosition);
-//            final boolean anyHidden = account.mUnsyncedGroups.size() > 0;
-//            return account.mSyncedGroups.size() + (anyHidden ? 1 : 0);
-//        }
-//
-//        /** {@inheritDoc} */
-//        public Object getGroup(int groupPosition) {
-//            return mAccounts.get(groupPosition);
-//        }
-//
-//        /** {@inheritDoc} */
-//        public int getGroupCount() {
-//            if (mAccounts == null) {
-//                return 0;
-//            }
-//            return mAccounts.size();
-//        }
-//
-//        /** {@inheritDoc} */
-//        public long getGroupId(int groupPosition) {
-//            return groupPosition;
-//        }
-//
-//        /** {@inheritDoc} */
-//        public boolean hasStableIds() {
-//            return true;
-//        }
-//
-//        /** {@inheritDoc} */
-//        public boolean isChildSelectable(int groupPosition, int childPosition) {
-//            return true;
-//        }
-//    }
-//
-//    /**
-//     * Handle any clicks on header views added to our {@link #mAdapter}, which
-//     * are usually the global modifier checkboxes.
-//     */
-//    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-//        Log.d(TAG, "OnItemClick, position=" + position + ", id=" + id);
-//        if (view == mHeaderPhones) {
-//            mDisplayPhones.toggle();
-//            return;
-//        }
-//        if (view == mDisplayOrderView) {
-//            Log.d(TAG, "Showing Display Order dialog");
-//            showDialog(DIALOG_DISPLAY_ORDER);
-//            return;
-//        }
-//        if (view == mSortOrderView) {
-//            Log.d(TAG, "Showing Sort Order dialog");
-//            showDialog(DIALOG_SORT_ORDER);
-//            return;
-//        }
-//    }
-//
-//    /** {@inheritDoc} */
-//    public void onClick(View view) {
-//        switch (view.getId()) {
-//            case R.id.btn_done: {
-//                this.doSaveAction();
-//                break;
-//            }
-//            case R.id.btn_discard: {
-//                this.finish();
-//                break;
-//            }
-//        }
-//    }
-//
-//    /**
-//     * Assign a specific value to {@link Prefs#DISPLAY_ONLY_PHONES}, refreshing
-//     * the visible list as needed.
-//     */
-//    protected void setDisplayOnlyPhones(boolean displayOnlyPhones) {
-//        mDisplayPhones.setChecked(displayOnlyPhones);
-//
-//        Editor editor = mPrefs.edit();
-//        editor.putBoolean(Prefs.DISPLAY_ONLY_PHONES, displayOnlyPhones);
-//        editor.apply();
-//
-//        mAdapter.setChildDescripWithPhones(displayOnlyPhones);
-//        mAdapter.notifyDataSetChanged();
-//    }
-//
-//    /**
-//     * Handle any clicks on {@link ExpandableListAdapter} children, which
-//     * usually mean toggling its visible state.
-//     */
-//    @Override
-//    public boolean onChildClick(ExpandableListView parent, View view, int groupPosition,
-//            int childPosition, long id) {
-//        final CheckBox checkbox = (CheckBox)view.findViewById(android.R.id.checkbox);
-//
-//        final AccountDisplay account = (AccountDisplay)mAdapter.getGroup(groupPosition);
-//        final GroupDelta child = (GroupDelta)mAdapter.getChild(groupPosition, childPosition);
-//        if (child != null) {
-//            checkbox.toggle();
-//            child.putVisible(checkbox.isChecked());
-//        } else {
-//            // Open context menu for bringing back unsynced
-//            this.openContextMenu(view);
-//        }
-//        return true;
-//    }
-//
-//    // TODO: move these definitions to framework constants when we begin
-//    // defining this mode through <sync-adapter> tags
-//    private static final int SYNC_MODE_UNSUPPORTED = 0;
-//    private static final int SYNC_MODE_UNGROUPED = 1;
-//    private static final int SYNC_MODE_EVERYTHING = 2;
-//
-//    protected int getSyncMode(AccountDisplay account) {
-//        // TODO: read sync mode through <sync-adapter> definition
-//        if (GoogleAccountType.ACCOUNT_TYPE.equals(account.mType)) {
-//            return SYNC_MODE_EVERYTHING;
-//        } else {
-//            return SYNC_MODE_UNSUPPORTED;
-//        }
-//    }
-//
-//    @Override
-//    public void onCreateContextMenu(ContextMenu menu, View view,
-//            ContextMenu.ContextMenuInfo menuInfo) {
-//        super.onCreateContextMenu(menu, view, menuInfo);
-//
-//        // Bail if not working with expandable long-press, or if not child
-//        if (!(menuInfo instanceof ExpandableListContextMenuInfo)) return;
-//
-//        final ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo) menuInfo;
-//        final int groupPosition = ExpandableListView.getPackedPositionGroup(info.packedPosition);
-//        final int childPosition = ExpandableListView.getPackedPositionChild(info.packedPosition);
-//
-//        // Skip long-press on expandable parents
-//        if (childPosition == -1) return;
-//
-//        final AccountDisplay account = (AccountDisplay)mAdapter.getGroup(groupPosition);
-//        final GroupDelta child = (GroupDelta)mAdapter.getChild(groupPosition, childPosition);
-//
-//        // Ignore when selective syncing unsupported
-//        final int syncMode = getSyncMode(account);
-//        if (syncMode == SYNC_MODE_UNSUPPORTED) return;
-//
-//        if (child != null) {
-//            showRemoveSync(menu, account, child, syncMode);
-//        } else {
-//            showAddSync(menu, account, syncMode);
-//        }
-//    }
-//
-//    protected void showRemoveSync(ContextMenu menu, final AccountDisplay account,
-//            final GroupDelta child, final int syncMode) {
-//        final CharSequence title = child.getTitle(this);
-//
-//        menu.setHeaderTitle(title);
-//        menu.add(R.string.menu_sync_remove).setOnMenuItemClickListener(
-//                new OnMenuItemClickListener() {
-//                    public boolean onMenuItemClick(MenuItem item) {
-//                        handleRemoveSync(account, child, syncMode, title);
-//                        return true;
-//                    }
-//                });
-//    }
-//
-//    protected void handleRemoveSync(final AccountDisplay account, final GroupDelta child,
-//            final int syncMode, CharSequence title) {
-//        final boolean shouldSyncUngrouped = account.mUngrouped.getShouldSync();
-//        if (syncMode == SYNC_MODE_EVERYTHING && shouldSyncUngrouped
-//                && !child.equals(account.mUngrouped)) {
-//            // Warn before removing this group when it would cause ungrouped to stop syncing
-//            final AlertDialog.Builder builder = new AlertDialog.Builder(this);
-//            final CharSequence removeMessage = this.getString(
-//                    R.string.display_warn_remove_ungrouped, title);
-//            builder.setTitle(R.string.menu_sync_remove);
-//            builder.setMessage(removeMessage);
-//            builder.setNegativeButton(android.R.string.cancel, null);
-//            builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
-//                public void onClick(DialogInterface dialog, int which) {
-//                    // Mark both this group and ungrouped to stop syncing
-//                    account.setShouldSync(account.mUngrouped, false);
-//                    account.setShouldSync(child, false);
-//                    mAdapter.notifyDataSetChanged();
-//                }
-//            });
-//            builder.show();
-//        } else {
-//            // Mark this group to not sync
-//            account.setShouldSync(child, false);
-//            mAdapter.notifyDataSetChanged();
-//        }
-//    }
-//
-//    protected void showAddSync(ContextMenu menu, final AccountDisplay account, final int syncMode) {
-//        menu.setHeaderTitle(R.string.dialog_sync_add);
-//
-//        // Create item for each available, unsynced group
-//        for (final GroupDelta child : account.mUnsyncedGroups) {
-//            if (!child.getShouldSync()) {
-//                final CharSequence title = child.getTitle(this);
-//                menu.add(title).setOnMenuItemClickListener(new OnMenuItemClickListener() {
-//                    public boolean onMenuItemClick(MenuItem item) {
-//                        // Adding specific group for syncing
-//                        if (child.mUngrouped && syncMode == SYNC_MODE_EVERYTHING) {
-//                            account.setShouldSync(true);
-//                        } else {
-//                            account.setShouldSync(child, true);
-//                        }
-//                        mAdapter.notifyDataSetChanged();
-//                        return true;
-//                    }
-//                });
-//            }
-//        }
-//    }
-//
-//    /** {@inheritDoc} */
-//    @Override
-//    public void onBackPressed() {
-//        doSaveAction();
-//    }
-//
-//    private void doSaveAction() {
-//        mContactsPrefs.setSortOrder(mSortOrder);
-//        mContactsPrefs.setDisplayOrder(mDisplayOrder);
-//
-//        if (mAdapter == null || mAdapter.mAccounts == null) {
-//            return;
-//        }
-//        setDisplayOnlyPhones(mDisplayPhones.isChecked());
-//        new UpdateTask(this).execute(mAdapter.mAccounts);
-//    }
-//
-//    /**
-//     * Background task that persists changes to {@link Groups#GROUP_VISIBLE},
-//     * showing spinner dialog to user while updating.
-//     */
-//    public static class UpdateTask extends
-//            WeakAsyncTask<AccountSet, Void, Void, Activity> {
-//        private WeakReference<ProgressDialog> mProgress;
-//
-//        public UpdateTask(Activity target) {
-//            super(target);
-//        }
-//
-//        /** {@inheritDoc} */
-//        @Override
-//        protected void onPreExecute(Activity target) {
-//            final Context context = target;
-//
-//            mProgress = new WeakReference<ProgressDialog>(ProgressDialog.show(context, null,
-//                    context.getText(R.string.savingDisplayGroups)));
-//
-//            // Before starting this task, start an empty service to protect our
-//            // process from being reclaimed by the system.
-//            context.startService(new Intent(context, EmptyService.class));
-//        }
-//
-//        /** {@inheritDoc} */
-//        @Override
-//        protected Void doInBackground(Activity target, AccountSet... params) {
-//            final Context context = target;
-//            final ContentValues values = new ContentValues();
-//            final ContentResolver resolver = context.getContentResolver();
-//
-//            try {
-//                // Build changes and persist in transaction
-//                final AccountSet set = params[0];
-//                final ArrayList<ContentProviderOperation> diff = set.buildDiff();
-//                resolver.applyBatch(ContactsContract.AUTHORITY, diff);
-//            } catch (RemoteException e) {
-//                Log.e(TAG, "Problem saving display groups", e);
-//            } catch (OperationApplicationException e) {
-//                Log.e(TAG, "Problem saving display groups", e);
-//            }
-//
-//            return null;
-//        }
-//
-//        /** {@inheritDoc} */
-//        @Override
-//        protected void onPostExecute(Activity target, Void result) {
-//            final Context context = target;
-//
-//            final ProgressDialog dialog = mProgress.get();
-//            if (dialog != null) {
-//                try {
-//                    dialog.dismiss();
-//                } catch (Exception e) {
-//                    Log.e(TAG, "Error dismissing progress dialog", e);
-//                }
-//            }
-//
-//            target.finish();
-//
-//            // Stop the service that was protecting us
-//            context.stopService(new Intent(context, EmptyService.class));
-//        }
-//    }
-//
-//    @Override
-//    public void startSearch(String initialQuery, boolean selectInitialQuery, Bundle appSearchData,
-//            boolean globalSearch) {
-//        if (globalSearch) {
-//            super.startSearch(initialQuery, selectInitialQuery, appSearchData, globalSearch);
-//        } else {
-//            ContactsSearchManager.startSearch(this, initialQuery);
-//        }
-//    }
+    /**
+     * Returns true if there are no preferences to display and therefore the
+     * corresponding menu item can be removed.
+     */
+    public static boolean isEmpty(Context context) {
+        return !context.getResources().getBoolean(R.bool.config_sort_order_user_changeable)
+                && !context.getResources().getBoolean(R.bool.config_display_order_user_changeable);
+    }
 }