Use Drawer in Settings app

- get rid of PreferenceActivity as much as we can and use fragments instead
- add Drawer widget
- add Dashboard high level entry into the Drawer (but this is work in progress and would be done in another CL)
- add bypass of fragment's Header  validation when launched from the Drawer but *force* validation if external
call thru an Intent

Be aware that WifiPickerActivity should remain for now a PreferenceActivity. It is used by SetupWizard and should
not trigger running the SettingsActivity's header building code. SetupWizard is a Home during the provisionnig process
and then deactivate itself as a Home but would make the Home header to appear in the Drawer (because momentarily we
would have two Home).

Also, verified that:

- the WiFi settings still work when called from SetupWizard
- when you have multiple Launchers, the Home header will appear in the list of Headers in the Drawer

Change-Id: I407a5e0fdd843ad7615d3d511c416a44e3d97c90
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index 91f7fbc0..6bcfbee 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -16,1045 +16,77 @@
 
 package com.android.settings;
 
-import android.accounts.Account;
-import android.accounts.AccountManager;
-import android.accounts.OnAccountsUpdateListener;
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.app.DialogFragment;
-import android.app.admin.DevicePolicyManager;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.SharedPreferences;
-import android.content.pm.ActivityInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.pm.ResolveInfo;
-import android.graphics.drawable.Drawable;
-import android.nfc.NfcAdapter;
-import android.os.Bundle;
-import android.os.INetworkManagementService;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.preference.Preference;
-import android.preference.PreferenceActivity;
-import android.preference.PreferenceFragment;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
-import android.widget.Button;
-import android.widget.ImageButton;
-import android.widget.ImageView;
-import android.widget.ListAdapter;
-import android.widget.Switch;
-import android.widget.TextView;
-
-import com.android.internal.util.ArrayUtils;
-import com.android.settings.accessibility.AccessibilitySettings;
-import com.android.settings.accessibility.CaptionPropertiesFragment;
-import com.android.settings.accessibility.ToggleAccessibilityServicePreferenceFragment;
-import com.android.settings.accounts.AccountSyncSettings;
-import com.android.settings.accounts.AuthenticatorHelper;
-import com.android.settings.accounts.ManageAccountsSettings;
 import com.android.settings.applications.AppOpsSummary;
-import com.android.settings.applications.ManageApplications;
-import com.android.settings.applications.ProcessStatsUi;
-import com.android.settings.bluetooth.BluetoothEnabler;
-import com.android.settings.bluetooth.BluetoothSettings;
-import com.android.settings.deviceinfo.Memory;
-import com.android.settings.deviceinfo.UsbSettings;
-import com.android.settings.fuelgauge.PowerUsageSummary;
-import com.android.settings.inputmethod.InputMethodAndLanguageSettings;
-import com.android.settings.inputmethod.KeyboardLayoutPickerFragment;
-import com.android.settings.inputmethod.SpellCheckersSettings;
-import com.android.settings.inputmethod.UserDictionaryList;
-import com.android.settings.location.LocationSettings;
-import com.android.settings.nfc.AndroidBeam;
-import com.android.settings.nfc.PaymentSettings;
-import com.android.settings.print.PrintJobSettingsFragment;
-import com.android.settings.print.PrintServiceSettingsFragment;
-import com.android.settings.print.PrintSettingsFragment;
-import com.android.settings.tts.TextToSpeechSettings;
-import com.android.settings.users.UserSettings;
-import com.android.settings.vpn2.VpnSettings;
-import com.android.settings.wfd.WifiDisplaySettings;
-import com.android.settings.wifi.AdvancedWifiSettings;
-import com.android.settings.wifi.WifiEnabler;
-import com.android.settings.wifi.WifiSettings;
-import com.android.settings.wifi.p2p.WifiP2pSettings;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
 
 /**
- * Top-level settings activity to handle single pane and double pane UI layout.
+ * Top-level Settings activity
  */
-public class Settings extends PreferenceActivity
-        implements ButtonBarHandler, OnAccountsUpdateListener {
-
-    private static final String LOG_TAG = "Settings";
-
-    private static final String META_DATA_KEY_HEADER_ID =
-        "com.android.settings.TOP_LEVEL_HEADER_ID";
-    private static final String META_DATA_KEY_FRAGMENT_CLASS =
-        "com.android.settings.FRAGMENT_CLASS";
-    private static final String EXTRA_UI_OPTIONS = "settings:ui_options";
-    private static final String SAVE_KEY_CURRENT_HEADER = "com.android.settings.CURRENT_HEADER";
-
-    private static boolean sShowNoHomeNotice = false;
-
-    private String mFragmentClass;
-    private int mTopLevelHeaderId;
-    private Header mFirstHeader;
-    private Header mCurrentHeader;
-    private boolean mInLocalHeaderSwitch;
-
-    // Show only these settings for restricted users
-    private int[] SETTINGS_FOR_RESTRICTED = {
-            R.id.wireless_section,
-            R.id.wifi_settings,
-            R.id.bluetooth_settings,
-            R.id.data_usage_settings,
-            R.id.wireless_settings,
-            R.id.device_section,
-            R.id.sound_settings,
-            R.id.display_settings,
-            R.id.storage_settings,
-            R.id.application_settings,
-            R.id.battery_settings,
-            R.id.personal_section,
-            R.id.location_settings,
-            R.id.security_settings,
-            R.id.language_settings,
-            R.id.user_settings,
-            R.id.account_settings,
-            R.id.account_add,
-            R.id.system_section,
-            R.id.date_time_settings,
-            R.id.about_settings,
-            R.id.accessibility_settings,
-            R.id.print_settings,
-            R.id.nfc_payment_settings,
-            R.id.home_settings
-    };
-
-    private SharedPreferences mDevelopmentPreferences;
-    private SharedPreferences.OnSharedPreferenceChangeListener mDevelopmentPreferencesListener;
-
-    // TODO: Update Call Settings based on airplane mode state.
-
-    protected HashMap<Integer, Integer> mHeaderIndexMap = new HashMap<Integer, Integer>();
-
-    private AuthenticatorHelper mAuthenticatorHelper;
-    private Header mLastHeader;
-    private boolean mListeningToAccountUpdates;
-
-    private boolean mBatteryPresent = true;
-    private BroadcastReceiver mBatteryInfoReceiver = new BroadcastReceiver() {
-
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            String action = intent.getAction();
-            if (Intent.ACTION_BATTERY_CHANGED.equals(action)) {
-                boolean batteryPresent = Utils.isBatteryPresent(intent);
-
-                if (mBatteryPresent != batteryPresent) {
-                    mBatteryPresent = batteryPresent;
-                    invalidateHeaders();
-                }
-            }
-        }
-    };
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        if (getIntent().hasExtra(EXTRA_UI_OPTIONS)) {
-            getWindow().setUiOptions(getIntent().getIntExtra(EXTRA_UI_OPTIONS, 0));
-        }
-
-        mAuthenticatorHelper = new AuthenticatorHelper();
-        mAuthenticatorHelper.updateAuthDescriptions(this);
-        mAuthenticatorHelper.onAccountsUpdated(this, null);
-
-        mDevelopmentPreferences = getSharedPreferences(DevelopmentSettings.PREF_FILE,
-                Context.MODE_PRIVATE);
-
-        getMetaData();
-        mInLocalHeaderSwitch = true;
-        super.onCreate(savedInstanceState);
-        mInLocalHeaderSwitch = false;
-
-        if (!onIsHidingHeaders() && onIsMultiPane()) {
-            highlightHeader(mTopLevelHeaderId);
-            // Force the title so that it doesn't get overridden by a direct launch of
-            // a specific settings screen.
-            setTitle(R.string.settings_label);
-        }
-
-        // Retrieve any saved state
-        if (savedInstanceState != null) {
-            mCurrentHeader = savedInstanceState.getParcelable(SAVE_KEY_CURRENT_HEADER);
-        }
-
-        // If the current header was saved, switch to it
-        if (savedInstanceState != null && mCurrentHeader != null) {
-            //switchToHeaderLocal(mCurrentHeader);
-            showBreadCrumbs(mCurrentHeader.title, null);
-        }
-
-        // Override up navigation for multi-pane, since we handle it in the fragment breadcrumbs
-        if (onIsMultiPane()) {
-            getActionBar().setDisplayHomeAsUpEnabled(false);
-            getActionBar().setHomeButtonEnabled(false);
-        }
-    }
-
-    @Override
-    protected void onSaveInstanceState(Bundle outState) {
-        super.onSaveInstanceState(outState);
-
-        // Save the current fragment, if it is the same as originally launched
-        if (mCurrentHeader != null) {
-            outState.putParcelable(SAVE_KEY_CURRENT_HEADER, mCurrentHeader);
-        }
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-
-        mDevelopmentPreferencesListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
-            @Override
-            public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
-                invalidateHeaders();
-            }
-        };
-        mDevelopmentPreferences.registerOnSharedPreferenceChangeListener(
-                mDevelopmentPreferencesListener);
-
-        ListAdapter listAdapter = getListAdapter();
-        if (listAdapter instanceof HeaderAdapter) {
-            ((HeaderAdapter) listAdapter).resume();
-        }
-        invalidateHeaders();
-
-        registerReceiver(mBatteryInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
-    }
-
-    @Override
-    public void onPause() {
-        super.onPause();
-
-        unregisterReceiver(mBatteryInfoReceiver);
-
-        ListAdapter listAdapter = getListAdapter();
-        if (listAdapter instanceof HeaderAdapter) {
-            ((HeaderAdapter) listAdapter).pause();
-        }
-
-        mDevelopmentPreferences.unregisterOnSharedPreferenceChangeListener(
-                mDevelopmentPreferencesListener);
-        mDevelopmentPreferencesListener = null;
-    }
-
-    @Override
-    public void onDestroy() {
-        super.onDestroy();
-        if (mListeningToAccountUpdates) {
-            AccountManager.get(this).removeOnAccountsUpdatedListener(this);
-        }
-    }
-
-    @Override
-    public boolean onIsMultiPane() {
-        return false;
-    }
-
-    private static final String[] ENTRY_FRAGMENTS = {
-        WirelessSettings.class.getName(),
-        WifiSettings.class.getName(),
-        AdvancedWifiSettings.class.getName(),
-        BluetoothSettings.class.getName(),
-        TetherSettings.class.getName(),
-        WifiP2pSettings.class.getName(),
-        VpnSettings.class.getName(),
-        DateTimeSettings.class.getName(),
-        LocalePicker.class.getName(),
-        InputMethodAndLanguageSettings.class.getName(),
-        SpellCheckersSettings.class.getName(),
-        UserDictionaryList.class.getName(),
-        UserDictionarySettings.class.getName(),
-        SoundSettings.class.getName(),
-        DisplaySettings.class.getName(),
-        DeviceInfoSettings.class.getName(),
-        ManageApplications.class.getName(),
-        ProcessStatsUi.class.getName(),
-        NotificationStation.class.getName(),
-        LocationSettings.class.getName(),
-        SecuritySettings.class.getName(),
-        PrivacySettings.class.getName(),
-        DeviceAdminSettings.class.getName(),
-        AccessibilitySettings.class.getName(),
-        CaptionPropertiesFragment.class.getName(),
-        com.android.settings.accessibility.ToggleInversionPreferenceFragment.class.getName(),
-        com.android.settings.accessibility.ToggleContrastPreferenceFragment.class.getName(),
-        com.android.settings.accessibility.ToggleDaltonizerPreferenceFragment.class.getName(),
-        TextToSpeechSettings.class.getName(),
-        Memory.class.getName(),
-        DevelopmentSettings.class.getName(),
-        UsbSettings.class.getName(),
-        AndroidBeam.class.getName(),
-        WifiDisplaySettings.class.getName(),
-        PowerUsageSummary.class.getName(),
-        AccountSyncSettings.class.getName(),
-        CryptKeeperSettings.class.getName(),
-        DataUsageSummary.class.getName(),
-        DreamSettings.class.getName(),
-        UserSettings.class.getName(),
-        NotificationAccessSettings.class.getName(),
-        ManageAccountsSettings.class.getName(),
-        PrintSettingsFragment.class.getName(),
-        PrintJobSettingsFragment.class.getName(),
-        TrustedCredentialsSettings.class.getName(),
-        PaymentSettings.class.getName(),
-        KeyboardLayoutPickerFragment.class.getName()
-    };
-
-    @Override
-    protected boolean isValidFragment(String fragmentName) {
-        // Almost all fragments are wrapped in this,
-        // except for a few that have their own activities.
-        for (int i = 0; i < ENTRY_FRAGMENTS.length; i++) {
-            if (ENTRY_FRAGMENTS[i].equals(fragmentName)) return true;
-        }
-        return false;
-    }
-
-    private void switchToHeaderLocal(Header header) {
-        mInLocalHeaderSwitch = true;
-        switchToHeader(header);
-        mInLocalHeaderSwitch = false;
-    }
-
-    @Override
-    public void switchToHeader(Header header) {
-        if (!mInLocalHeaderSwitch) {
-            mCurrentHeader = null;
-        }
-        super.switchToHeader(header);
-    }
-
-    @Override
-    public void onNewIntent(Intent intent) {
-        super.onNewIntent(intent);
-
-        // If it is not launched from history, then reset to top-level
-        if ((intent.getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0) {
-            if (mFirstHeader != null && !onIsHidingHeaders() && onIsMultiPane()) {
-                switchToHeaderLocal(mFirstHeader);
-            }
-            getListView().setSelectionFromTop(0, 0);
-        }
-    }
-
-    private void highlightHeader(int id) {
-        if (id != 0) {
-            Integer index = mHeaderIndexMap.get(id);
-            if (index != null) {
-                getListView().setItemChecked(index, true);
-                if (isMultiPane()) {
-                    getListView().smoothScrollToPosition(index);
-                }
-            }
-        }
-    }
-
-    @Override
-    public Intent getIntent() {
-        Intent superIntent = super.getIntent();
-        String startingFragment = getStartingFragmentClass(superIntent);
-        // This is called from super.onCreate, isMultiPane() is not yet reliable
-        // Do not use onIsHidingHeaders either, which relies itself on this method
-        if (startingFragment != null && !onIsMultiPane()) {
-            Intent modIntent = new Intent(superIntent);
-            modIntent.putExtra(EXTRA_SHOW_FRAGMENT, startingFragment);
-            Bundle args = superIntent.getExtras();
-            if (args != null) {
-                args = new Bundle(args);
-            } else {
-                args = new Bundle();
-            }
-            args.putParcelable("intent", superIntent);
-            modIntent.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS, superIntent.getExtras());
-            return modIntent;
-        }
-        return superIntent;
-    }
-
-    /**
-     * Checks if the component name in the intent is different from the Settings class and
-     * returns the class name to load as a fragment.
-     */
-    protected String getStartingFragmentClass(Intent intent) {
-        if (mFragmentClass != null) return mFragmentClass;
-
-        String intentClass = intent.getComponent().getClassName();
-        if (intentClass.equals(getClass().getName())) return null;
-
-        if ("com.android.settings.ManageApplications".equals(intentClass)
-                || "com.android.settings.RunningServices".equals(intentClass)
-                || "com.android.settings.applications.StorageUse".equals(intentClass)) {
-            // Old names of manage apps.
-            intentClass = com.android.settings.applications.ManageApplications.class.getName();
-        }
-
-        return intentClass;
-    }
-
-    /**
-     * Override initial header when an activity-alias is causing Settings to be launched
-     * for a specific fragment encoded in the android:name parameter.
-     */
-    @Override
-    public Header onGetInitialHeader() {
-        String fragmentClass = getStartingFragmentClass(super.getIntent());
-        if (fragmentClass != null) {
-            Header header = new Header();
-            header.fragment = fragmentClass;
-            header.title = getTitle();
-            header.fragmentArguments = getIntent().getExtras();
-            mCurrentHeader = header;
-            return header;
-        }
-
-        return mFirstHeader;
-    }
-
-    @Override
-    public Intent onBuildStartFragmentIntent(String fragmentName, Bundle args,
-            int titleRes, int shortTitleRes) {
-        Intent intent = super.onBuildStartFragmentIntent(fragmentName, args,
-                titleRes, shortTitleRes);
-
-        // Some fragments want split ActionBar; these should stay in sync with
-        // uiOptions for fragments also defined as activities in manifest.
-        if (WifiSettings.class.getName().equals(fragmentName) ||
-                WifiP2pSettings.class.getName().equals(fragmentName) ||
-                BluetoothSettings.class.getName().equals(fragmentName) ||
-                DreamSettings.class.getName().equals(fragmentName) ||
-                LocationSettings.class.getName().equals(fragmentName) ||
-                ToggleAccessibilityServicePreferenceFragment.class.getName().equals(fragmentName) ||
-                PrintSettingsFragment.class.getName().equals(fragmentName) ||
-                PrintServiceSettingsFragment.class.getName().equals(fragmentName)) {
-            intent.putExtra(EXTRA_UI_OPTIONS, ActivityInfo.UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW);
-        }
-
-        intent.setClass(this, SubSettings.class);
-        return intent;
-    }
-
-    /**
-     * Populate the activity with the top-level headers.
-     */
-    @Override
-    public void onBuildHeaders(List<Header> headers) {
-        if (!onIsHidingHeaders()) {
-            loadHeadersFromResource(R.xml.settings_headers, headers);
-            updateHeaderList(headers);
-        }
-    }
-
-    private void updateHeaderList(List<Header> target) {
-        final boolean showDev = mDevelopmentPreferences.getBoolean(
-                DevelopmentSettings.PREF_SHOW,
-                android.os.Build.TYPE.equals("eng"));
-        int i = 0;
-
-        final UserManager um = (UserManager) getSystemService(Context.USER_SERVICE);
-        mHeaderIndexMap.clear();
-        while (i < target.size()) {
-            Header header = target.get(i);
-            // Ids are integers, so downcasting
-            int id = (int) header.id;
-            if (id == R.id.operator_settings || id == R.id.manufacturer_settings) {
-                Utils.updateHeaderToSpecificActivityFromMetaDataOrRemove(this, target, header);
-            } else if (id == R.id.wifi_settings) {
-                // Remove WiFi Settings if WiFi service is not available.
-                if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI)) {
-                    target.remove(i);
-                }
-            } else if (id == R.id.bluetooth_settings) {
-                // Remove Bluetooth Settings if Bluetooth service is not available.
-                if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)) {
-                    target.remove(i);
-                }
-            } else if (id == R.id.data_usage_settings) {
-                // Remove data usage when kernel module not enabled
-                final INetworkManagementService netManager = INetworkManagementService.Stub
-                        .asInterface(ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE));
-                try {
-                    if (!netManager.isBandwidthControlEnabled()) {
-                        target.remove(i);
-                    }
-                } catch (RemoteException e) {
-                    // ignored
-                }
-            } else if (id == R.id.battery_settings) {
-                // Remove battery settings when battery is not available. (e.g. TV)
-
-                if (!mBatteryPresent) {
-                    target.remove(i);
-                }
-            } else if (id == R.id.account_settings) {
-                int headerIndex = i + 1;
-                i = insertAccountsHeaders(target, headerIndex);
-            } else if (id == R.id.home_settings) {
-                if (!updateHomeSettingHeaders(header)) {
-                    target.remove(i);
-                }
-            } else if (id == R.id.user_settings) {
-                if (!UserHandle.MU_ENABLED
-                        || !UserManager.supportsMultipleUsers()
-                        || Utils.isMonkeyRunning()) {
-                    target.remove(i);
-                }
-            } else if (id == R.id.nfc_payment_settings) {
-                if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_NFC)) {
-                    target.remove(i);
-                } else {
-                    // Only show if NFC is on and we have the HCE feature
-                    NfcAdapter adapter = NfcAdapter.getDefaultAdapter(this);
-                    if (!adapter.isEnabled() || !getPackageManager().hasSystemFeature(
-                            PackageManager.FEATURE_NFC_HOST_CARD_EMULATION)) {
-                        target.remove(i);
-                    }
-                }
-            } else if (id == R.id.development_settings) {
-                if (!showDev) {
-                    target.remove(i);
-                }
-            } else if (id == R.id.account_add) {
-                if (um.hasUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS)) {
-                    target.remove(i);
-                }
-            }
-
-            if (i < target.size() && target.get(i) == header
-                    && UserHandle.MU_ENABLED && UserHandle.myUserId() != 0
-                    && !ArrayUtils.contains(SETTINGS_FOR_RESTRICTED, id)) {
-                target.remove(i);
-            }
-
-            // Increment if the current one wasn't removed by the Utils code.
-            if (i < target.size() && target.get(i) == header) {
-                // Hold on to the first header, when we need to reset to the top-level
-                if (mFirstHeader == null &&
-                        HeaderAdapter.getHeaderType(header) != HeaderAdapter.HEADER_TYPE_CATEGORY) {
-                    mFirstHeader = header;
-                }
-                mHeaderIndexMap.put(id, i);
-                i++;
-            }
-        }
-    }
-
-    private int insertAccountsHeaders(List<Header> target, int headerIndex) {
-        String[] accountTypes = mAuthenticatorHelper.getEnabledAccountTypes();
-        List<Header> accountHeaders = new ArrayList<Header>(accountTypes.length);
-        for (String accountType : accountTypes) {
-            CharSequence label = mAuthenticatorHelper.getLabelForType(this, accountType);
-            if (label == null) {
-                continue;
-            }
-
-            Account[] accounts = AccountManager.get(this).getAccountsByType(accountType);
-            boolean skipToAccount = accounts.length == 1
-                    && !mAuthenticatorHelper.hasAccountPreferences(accountType);
-            Header accHeader = new Header();
-            accHeader.title = label;
-            if (accHeader.extras == null) {
-                accHeader.extras = new Bundle();
-            }
-            if (skipToAccount) {
-                accHeader.breadCrumbTitleRes = R.string.account_sync_settings_title;
-                accHeader.breadCrumbShortTitleRes = R.string.account_sync_settings_title;
-                accHeader.fragment = AccountSyncSettings.class.getName();
-                accHeader.fragmentArguments = new Bundle();
-                // Need this for the icon
-                accHeader.extras.putString(ManageAccountsSettings.KEY_ACCOUNT_TYPE, accountType);
-                accHeader.extras.putParcelable(AccountSyncSettings.ACCOUNT_KEY, accounts[0]);
-                accHeader.fragmentArguments.putParcelable(AccountSyncSettings.ACCOUNT_KEY,
-                        accounts[0]);
-            } else {
-                accHeader.breadCrumbTitle = label;
-                accHeader.breadCrumbShortTitle = label;
-                accHeader.fragment = ManageAccountsSettings.class.getName();
-                accHeader.fragmentArguments = new Bundle();
-                accHeader.extras.putString(ManageAccountsSettings.KEY_ACCOUNT_TYPE, accountType);
-                accHeader.fragmentArguments.putString(ManageAccountsSettings.KEY_ACCOUNT_TYPE,
-                        accountType);
-                if (!isMultiPane()) {
-                    accHeader.fragmentArguments.putString(ManageAccountsSettings.KEY_ACCOUNT_LABEL,
-                            label.toString());
-                }
-            }
-            accountHeaders.add(accHeader);
-            mAuthenticatorHelper.preloadDrawableForType(this, accountType);
-        }
-
-        // Sort by label
-        Collections.sort(accountHeaders, new Comparator<Header>() {
-            @Override
-            public int compare(Header h1, Header h2) {
-                return h1.title.toString().compareTo(h2.title.toString());
-            }
-        });
-
-        for (Header header : accountHeaders) {
-            target.add(headerIndex++, header);
-        }
-        if (!mListeningToAccountUpdates) {
-            AccountManager.get(this).addOnAccountsUpdatedListener(this, null, true);
-            mListeningToAccountUpdates = true;
-        }
-        return headerIndex;
-    }
-
-    private boolean updateHomeSettingHeaders(Header header) {
-        // Once we decide to show Home settings, keep showing it forever
-        SharedPreferences sp = getSharedPreferences(HomeSettings.HOME_PREFS, Context.MODE_PRIVATE);
-        if (sp.getBoolean(HomeSettings.HOME_PREFS_DO_SHOW, false)) {
-            return true;
-        }
-
-        try {
-            final ArrayList<ResolveInfo> homeApps = new ArrayList<ResolveInfo>();
-            getPackageManager().getHomeActivities(homeApps);
-            if (homeApps.size() < 2) {
-                // When there's only one available home app, omit this settings
-                // category entirely at the top level UI.  If the user just
-                // uninstalled the penultimate home app candidiate, we also
-                // now tell them about why they aren't seeing 'Home' in the list.
-                if (sShowNoHomeNotice) {
-                    sShowNoHomeNotice = false;
-                    NoHomeDialogFragment.show(this);
-                }
-                return false;
-            } else {
-                // Okay, we're allowing the Home settings category.  Tell it, when
-                // invoked via this front door, that we'll need to be told about the
-                // case when the user uninstalls all but one home app.
-                if (header.fragmentArguments == null) {
-                    header.fragmentArguments = new Bundle();
-                }
-                header.fragmentArguments.putBoolean(HomeSettings.HOME_SHOW_NOTICE, true);
-            }
-        } catch (Exception e) {
-            // Can't look up the home activity; bail on configuring the icon
-            Log.w(LOG_TAG, "Problem looking up home activity!", e);
-        }
-
-        sp.edit().putBoolean(HomeSettings.HOME_PREFS_DO_SHOW, true).apply();
-        return true;
-    }
-
-    private void getMetaData() {
-        try {
-            ActivityInfo ai = getPackageManager().getActivityInfo(getComponentName(),
-                    PackageManager.GET_META_DATA);
-            if (ai == null || ai.metaData == null) return;
-            mTopLevelHeaderId = ai.metaData.getInt(META_DATA_KEY_HEADER_ID);
-            mFragmentClass = ai.metaData.getString(META_DATA_KEY_FRAGMENT_CLASS);
-        } catch (NameNotFoundException nnfe) {
-            // No recovery
-            Log.d(LOG_TAG, "Cannot get Metadata for: " + getComponentName().toString());
-        }
-    }
-
-    @Override
-    public boolean hasNextButton() {
-        return super.hasNextButton();
-    }
-
-    @Override
-    public Button getNextButton() {
-        return super.getNextButton();
-    }
-
-    public static class NoHomeDialogFragment extends DialogFragment {
-        public static void show(Activity parent) {
-            final NoHomeDialogFragment dialog = new NoHomeDialogFragment();
-            dialog.show(parent.getFragmentManager(), null);
-        }
-
-        @Override
-        public Dialog onCreateDialog(Bundle savedInstanceState) {
-            return new AlertDialog.Builder(getActivity())
-                    .setMessage(R.string.only_one_home_message)
-                    .setPositiveButton(android.R.string.ok, null)
-                    .create();
-        }
-    }
-
-    private static class HeaderAdapter extends ArrayAdapter<Header> {
-        static final int HEADER_TYPE_CATEGORY = 0;
-        static final int HEADER_TYPE_NORMAL = 1;
-        static final int HEADER_TYPE_SWITCH = 2;
-        static final int HEADER_TYPE_BUTTON = 3;
-        private static final int HEADER_TYPE_COUNT = HEADER_TYPE_BUTTON + 1;
-
-        private final WifiEnabler mWifiEnabler;
-        private final BluetoothEnabler mBluetoothEnabler;
-        private AuthenticatorHelper mAuthHelper;
-        private DevicePolicyManager mDevicePolicyManager;
-
-        private static class HeaderViewHolder {
-            ImageView mIcon;
-            TextView mTitle;
-            TextView mSummary;
-            Switch mSwitch;
-            ImageButton mButton;
-            View mDivider;
-        }
-
-        private LayoutInflater mInflater;
-
-        static int getHeaderType(Header header) {
-            if (header.fragment == null && header.intent == null) {
-                return HEADER_TYPE_CATEGORY;
-            } else if (header.id == R.id.wifi_settings || header.id == R.id.bluetooth_settings) {
-                return HEADER_TYPE_SWITCH;
-            } else if (header.id == R.id.security_settings) {
-                return HEADER_TYPE_BUTTON;
-            } else {
-                return HEADER_TYPE_NORMAL;
-            }
-        }
-
-        @Override
-        public int getItemViewType(int position) {
-            Header header = getItem(position);
-            return getHeaderType(header);
-        }
-
-        @Override
-        public boolean areAllItemsEnabled() {
-            return false; // because of categories
-        }
-
-        @Override
-        public boolean isEnabled(int position) {
-            return getItemViewType(position) != HEADER_TYPE_CATEGORY;
-        }
-
-        @Override
-        public int getViewTypeCount() {
-            return HEADER_TYPE_COUNT;
-        }
-
-        @Override
-        public boolean hasStableIds() {
-            return true;
-        }
-
-        public HeaderAdapter(Context context, List<Header> objects,
-                AuthenticatorHelper authenticatorHelper, DevicePolicyManager dpm) {
-            super(context, 0, objects);
-
-            mAuthHelper = authenticatorHelper;
-            mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-
-            // Temp Switches provided as placeholder until the adapter replaces these with actual
-            // Switches inflated from their layouts. Must be done before adapter is set in super
-            mWifiEnabler = new WifiEnabler(context, new Switch(context));
-            mBluetoothEnabler = new BluetoothEnabler(context, new Switch(context));
-            mDevicePolicyManager = dpm;
-        }
-
-        @Override
-        public View getView(int position, View convertView, ViewGroup parent) {
-            HeaderViewHolder holder;
-            Header header = getItem(position);
-            int headerType = getHeaderType(header);
-            View view = null;
-
-            if (convertView == null) {
-                holder = new HeaderViewHolder();
-                switch (headerType) {
-                    case HEADER_TYPE_CATEGORY:
-                        view = new TextView(getContext(), null,
-                                android.R.attr.listSeparatorTextViewStyle);
-                        holder.mTitle = (TextView) view;
-                        break;
-
-                    case HEADER_TYPE_SWITCH:
-                        view = mInflater.inflate(R.layout.preference_header_switch_item, parent,
-                                false);
-                        holder.mIcon = (ImageView) view.findViewById(R.id.icon);
-                        holder.mTitle = (TextView)
-                                view.findViewById(com.android.internal.R.id.title);
-                        holder.mSummary = (TextView)
-                                view.findViewById(com.android.internal.R.id.summary);
-                        holder.mSwitch = (Switch) view.findViewById(R.id.switchWidget);
-                        break;
-
-                    case HEADER_TYPE_BUTTON:
-                        view = mInflater.inflate(R.layout.preference_header_button_item, parent,
-                                false);
-                        holder.mIcon = (ImageView) view.findViewById(R.id.icon);
-                        holder.mTitle = (TextView)
-                                view.findViewById(com.android.internal.R.id.title);
-                        holder.mSummary = (TextView)
-                                view.findViewById(com.android.internal.R.id.summary);
-                        holder.mButton = (ImageButton) view.findViewById(R.id.buttonWidget);
-                        holder.mDivider = view.findViewById(R.id.divider);
-                        break;
-
-                    case HEADER_TYPE_NORMAL:
-                        view = mInflater.inflate(
-                                R.layout.preference_header_item, parent,
-                                false);
-                        holder.mIcon = (ImageView) view.findViewById(R.id.icon);
-                        holder.mTitle = (TextView)
-                                view.findViewById(com.android.internal.R.id.title);
-                        holder.mSummary = (TextView)
-                                view.findViewById(com.android.internal.R.id.summary);
-                        break;
-                }
-                view.setTag(holder);
-            } else {
-                view = convertView;
-                holder = (HeaderViewHolder) view.getTag();
-            }
-
-            // All view fields must be updated every time, because the view may be recycled
-            switch (headerType) {
-                case HEADER_TYPE_CATEGORY:
-                    holder.mTitle.setText(header.getTitle(getContext().getResources()));
-                    break;
-
-                case HEADER_TYPE_SWITCH:
-                    // Would need a different treatment if the main menu had more switches
-                    if (header.id == R.id.wifi_settings) {
-                        mWifiEnabler.setSwitch(holder.mSwitch);
-                    } else {
-                        mBluetoothEnabler.setSwitch(holder.mSwitch);
-                    }
-                    updateCommonHeaderView(header, holder);
-                    break;
-
-                case HEADER_TYPE_BUTTON:
-                    if (header.id == R.id.security_settings) {
-                        boolean hasCert = DevicePolicyManager.hasAnyCaCertsInstalled();
-                        if (hasCert) {
-                            holder.mButton.setVisibility(View.VISIBLE);
-                            holder.mDivider.setVisibility(View.VISIBLE);
-                            boolean isManaged = mDevicePolicyManager.getDeviceOwner() != null;
-                            if (isManaged) {
-                                holder.mButton.setImageResource(R.drawable.ic_settings_about);
-                            } else {
-                                holder.mButton.setImageResource(
-                                        android.R.drawable.stat_notify_error);
-                            }
-                            holder.mButton.setOnClickListener(new OnClickListener() {
-                                @Override
-                                public void onClick(View v) {
-                                    Intent intent = new Intent(
-                                            android.provider.Settings.ACTION_MONITORING_CERT_INFO);
-                                    getContext().startActivity(intent);
-                                }
-                            });
-                        } else {
-                            holder.mButton.setVisibility(View.GONE);
-                            holder.mDivider.setVisibility(View.GONE);
-                        }
-                    }
-                    updateCommonHeaderView(header, holder);
-                    break;
-
-                case HEADER_TYPE_NORMAL:
-                    updateCommonHeaderView(header, holder);
-                    break;
-            }
-
-            return view;
-        }
-
-        private void updateCommonHeaderView(Header header, HeaderViewHolder holder) {
-                if (header.extras != null
-                        && header.extras.containsKey(ManageAccountsSettings.KEY_ACCOUNT_TYPE)) {
-                    String accType = header.extras.getString(
-                            ManageAccountsSettings.KEY_ACCOUNT_TYPE);
-                    Drawable icon = mAuthHelper.getDrawableForType(getContext(), accType);
-                    setHeaderIcon(holder, icon);
-                } else {
-                    holder.mIcon.setImageResource(header.iconRes);
-                }
-                holder.mTitle.setText(header.getTitle(getContext().getResources()));
-                CharSequence summary = header.getSummary(getContext().getResources());
-                if (!TextUtils.isEmpty(summary)) {
-                    holder.mSummary.setVisibility(View.VISIBLE);
-                    holder.mSummary.setText(summary);
-                } else {
-                    holder.mSummary.setVisibility(View.GONE);
-                }
-            }
-
-        private void setHeaderIcon(HeaderViewHolder holder, Drawable icon) {
-            ViewGroup.LayoutParams lp = holder.mIcon.getLayoutParams();
-            lp.width = getContext().getResources().getDimensionPixelSize(
-                    R.dimen.header_icon_width);
-            lp.height = lp.width;
-            holder.mIcon.setLayoutParams(lp);
-            holder.mIcon.setImageDrawable(icon);
-        }
-
-        public void resume() {
-            mWifiEnabler.resume();
-            mBluetoothEnabler.resume();
-        }
-
-        public void pause() {
-            mWifiEnabler.pause();
-            mBluetoothEnabler.pause();
-        }
-    }
-
-    @Override
-    public void onHeaderClick(Header header, int position) {
-        boolean revert = false;
-        if (header.id == R.id.account_add) {
-            revert = true;
-        }
-
-        super.onHeaderClick(header, position);
-
-        if (revert && mLastHeader != null) {
-            highlightHeader((int) mLastHeader.id);
-        } else {
-            mLastHeader = header;
-        }
-    }
-
-    @Override
-    public boolean onPreferenceStartFragment(PreferenceFragment caller, Preference pref) {
-        // Override the fragment title for Wallpaper settings
-        int titleRes = pref.getTitleRes();
-        if (pref.getFragment().equals(WallpaperTypeSettings.class.getName())) {
-            titleRes = R.string.wallpaper_settings_fragment_title;
-        } else if (pref.getFragment().equals(OwnerInfoSettings.class.getName())
-                && UserHandle.myUserId() != UserHandle.USER_OWNER) {
-            if (UserManager.get(this).isLinkedUser()) {
-                titleRes = R.string.profile_info_settings_title;
-            } else {
-                titleRes = R.string.user_info_settings_title;
-            }
-        }
-        startPreferencePanel(pref.getFragment(), pref.getExtras(), titleRes, pref.getTitle(),
-                null, 0);
-        return true;
-    }
-
-    @Override
-    public boolean shouldUpRecreateTask(Intent targetIntent) {
-        return super.shouldUpRecreateTask(new Intent(this, Settings.class));
-    }
-
-    @Override
-    public void setListAdapter(ListAdapter adapter) {
-        if (adapter == null) {
-            super.setListAdapter(null);
-        } else {
-            DevicePolicyManager dpm =
-                    (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
-            super.setListAdapter(new HeaderAdapter(this, getHeaders(), mAuthenticatorHelper, dpm));
-        }
-    }
-
-    @Override
-    public void onAccountsUpdated(Account[] accounts) {
-        // TODO: watch for package upgrades to invalidate cache; see 7206643
-        mAuthenticatorHelper.updateAuthDescriptions(this);
-        mAuthenticatorHelper.onAccountsUpdated(this, accounts);
-        invalidateHeaders();
-    }
-
-    public static void requestHomeNotice() {
-        sShowNoHomeNotice = true;
-    }
+public class Settings extends SettingsActivity {
 
     /*
-     * Settings subclasses for launching independently.
-     */
-    public static class BluetoothSettingsActivity extends Settings { /* empty */ }
-    public static class WirelessSettingsActivity extends Settings { /* empty */ }
-    public static class TetherSettingsActivity extends Settings { /* empty */ }
-    public static class VpnSettingsActivity extends Settings { /* empty */ }
-    public static class DateTimeSettingsActivity extends Settings { /* empty */ }
-    public static class StorageSettingsActivity extends Settings { /* empty */ }
-    public static class WifiSettingsActivity extends Settings { /* empty */ }
-    public static class WifiP2pSettingsActivity extends Settings { /* empty */ }
-    public static class InputMethodAndLanguageSettingsActivity extends Settings { /* empty */ }
-    public static class KeyboardLayoutPickerActivity extends Settings { /* empty */ }
-    public static class InputMethodAndSubtypeEnablerActivity extends Settings { /* empty */ }
-    public static class SpellCheckersSettingsActivity extends Settings { /* empty */ }
-    public static class LocalePickerActivity extends Settings { /* empty */ }
-    public static class UserDictionarySettingsActivity extends Settings { /* empty */ }
-    public static class SoundSettingsActivity extends Settings { /* empty */ }
-    public static class DisplaySettingsActivity extends Settings { /* empty */ }
-    public static class DeviceInfoSettingsActivity extends Settings { /* empty */ }
-    public static class ApplicationSettingsActivity extends Settings { /* empty */ }
-    public static class ManageApplicationsActivity extends Settings { /* empty */ }
-    public static class AppOpsSummaryActivity extends Settings {
+    * Settings subclasses for launching independently.
+    */
+    public static class BluetoothSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class WirelessSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class TetherSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class VpnSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class DateTimeSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class StorageSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class WifiSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class WifiP2pSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class InputMethodAndLanguageSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class KeyboardLayoutPickerActivity extends SettingsActivity { /* empty */ }
+    public static class InputMethodAndSubtypeEnablerActivity extends SettingsActivity { /* empty */ }
+    public static class SpellCheckersSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class LocalePickerActivity extends SettingsActivity { /* empty */ }
+    public static class UserDictionarySettingsActivity extends SettingsActivity { /* empty */ }
+    public static class SoundSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class DisplaySettingsActivity extends SettingsActivity { /* empty */ }
+    public static class DeviceInfoSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class ApplicationSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class ManageApplicationsActivity extends SettingsActivity { /* empty */ }
+    public static class AppOpsSummaryActivity extends SettingsActivity {
         @Override
         public boolean isValidFragment(String className) {
             if (AppOpsSummary.class.getName().equals(className)) {
                 return true;
             }
             return super.isValidFragment(className);
-        }
+            }
     }
-    public static class StorageUseActivity extends Settings { /* empty */ }
-    public static class DevelopmentSettingsActivity extends Settings { /* empty */ }
-    public static class AccessibilitySettingsActivity extends Settings { /* empty */ }
-    public static class CaptioningSettingsActivity extends Settings { /* empty */ }
-    public static class AccessibilityInversionSettingsActivity extends Settings { /* empty */ }
-    public static class AccessibilityContrastSettingsActivity extends Settings { /* empty */ }
-    public static class AccessibilityDaltonizerSettingsActivity extends Settings { /* empty */ }
-    public static class SecuritySettingsActivity extends Settings { /* empty */ }
-    public static class LocationSettingsActivity extends Settings { /* empty */ }
-    public static class PrivacySettingsActivity extends Settings { /* empty */ }
-    public static class RunningServicesActivity extends Settings { /* empty */ }
-    public static class ManageAccountsSettingsActivity extends Settings { /* empty */ }
-    public static class PowerUsageSummaryActivity extends Settings { /* empty */ }
-    public static class AccountSyncSettingsActivity extends Settings { /* empty */ }
-    public static class AccountSyncSettingsInAddAccountActivity extends Settings { /* empty */ }
-    public static class CryptKeeperSettingsActivity extends Settings { /* empty */ }
-    public static class DeviceAdminSettingsActivity extends Settings { /* empty */ }
-    public static class DataUsageSummaryActivity extends Settings { /* empty */ }
-    public static class AdvancedWifiSettingsActivity extends Settings { /* empty */ }
-    public static class TextToSpeechSettingsActivity extends Settings { /* empty */ }
-    public static class AndroidBeamSettingsActivity extends Settings { /* empty */ }
-    public static class WifiDisplaySettingsActivity extends Settings { /* empty */ }
-    public static class DreamSettingsActivity extends Settings { /* empty */ }
-    public static class NotificationStationActivity extends Settings { /* empty */ }
-    public static class UserSettingsActivity extends Settings { /* empty */ }
-    public static class NotificationAccessSettingsActivity extends Settings { /* empty */ }
-    public static class UsbSettingsActivity extends Settings { /* empty */ }
-    public static class TrustedCredentialsSettingsActivity extends Settings { /* empty */ }
-    public static class PaymentSettingsActivity extends Settings { /* empty */ }
-    public static class PrintSettingsActivity extends Settings { /* empty */ }
-    public static class PrintJobSettingsActivity extends Settings { /* empty */ }
+    public static class StorageUseActivity extends SettingsActivity { /* empty */ }
+    public static class DevelopmentSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class AccessibilitySettingsActivity extends SettingsActivity { /* empty */ }
+    public static class CaptioningSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class AccessibilityInversionSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class AccessibilityContrastSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class AccessibilityDaltonizerSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class SecuritySettingsActivity extends SettingsActivity { /* empty */ }
+    public static class LocationSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class PrivacySettingsActivity extends SettingsActivity { /* empty */ }
+    public static class RunningServicesActivity extends SettingsActivity { /* empty */ }
+    public static class ManageAccountsSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class PowerUsageSummaryActivity extends SettingsActivity { /* empty */ }
+    public static class ChooseAccountActivity extends SettingsActivity { /* empty */ }
+    public static class AccountSyncSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class AccountSyncSettingsInAddAccountActivity extends SettingsActivity { /* empty */ }
+    public static class CryptKeeperSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class DeviceAdminSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class DataUsageSummaryActivity extends SettingsActivity { /* empty */ }
+    public static class AdvancedWifiSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class TextToSpeechSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class AndroidBeamSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class WifiDisplaySettingsActivity extends SettingsActivity { /* empty */ }
+    public static class DreamSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class NotificationStationActivity extends SettingsActivity { /* empty */ }
+    public static class UserSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class NotificationAccessSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class UsbSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class TrustedCredentialsSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class PaymentSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class PrintSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class PrintJobSettingsActivity extends SettingsActivity { /* empty */ }
+
+    public static class TopLevelSettings extends SettingsActivity { /* empty */ }
 }
+