Merge "Fully deprecate Power Control widget." into lmp-dev
diff --git a/res/layout/bluetooth_device_picker.xml b/res/layout/bluetooth_device_picker.xml
index 0a63e25..9d8ae86 100755
--- a/res/layout/bluetooth_device_picker.xml
+++ b/res/layout/bluetooth_device_picker.xml
@@ -15,14 +15,38 @@
 -->
 
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
+        android:gravity="center"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="vertical">
 
-    <fragment
-        android:id="@+id/bluetooth_device_picker_fragment"
-        android:name="com.android.settings.bluetooth.DevicePickerFragment"
-        android:layout_width="match_parent"
-        android:layout_height="0dip"
-        android:layout_weight="1" />
+    <LinearLayout android:id="@+id/dialog_layout"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            android:paddingBottom="@dimen/bluetooth_dialog_padding"
+            style="@style/wifi_item" >
+
+            <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/bluetooth_preference_paired_dialog_name_label"
+                    android:textDirection="locale"
+                    style="@style/wifi_item_label" />
+
+            <EditText android:id="@+id/name"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:inputType="textNoSuggestions"
+                    android:maxLength="@integer/bluetooth_name_length"
+                    android:singleLine="true"
+                    style="@style/wifi_item_edit_content" />
+
+            <fragment android:id="@+id/bluetooth_fragment_settings"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    class="com.android.settings.bluetooth.DeviceProfilesSettings" />
+
+    </LinearLayout>
+
 </LinearLayout>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 62162d3..cb87bf0 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -204,4 +204,8 @@
     <dimen name="checkbox_widget_min_width">58dip</dimen>
     <dimen name="checkbox_layout_padding">16dip</dimen>
 
+    <!-- Bluetooth Preferences -->
+    <dimen name="bluetooth_dialog_padding">8dip</dimen>
+    <integer name="bluetooth_name_length">32</integer>
+
 </resources>
diff --git a/res/xml/bluetooth_device_advanced.xml b/res/xml/bluetooth_device_advanced.xml
index 8d2261c..75c89ca 100644
--- a/res/xml/bluetooth_device_advanced.xml
+++ b/res/xml/bluetooth_device_advanced.xml
@@ -18,19 +18,6 @@
         xmlns:android="http://schemas.android.com/apk/res/android"
         android:title="@string/bluetooth_device_advanced_title">
 
-    <EditTextPreference
-            android:key="rename_device"
-            android:title="@string/bluetooth_device_advanced_rename_device"
-            android:order="20"
-            android:persistent="false" />
-
-    <Preference
-            android:key="unpair"
-            android:title="@string/bluetooth_device_context_unpair"
-            android:order="40"
-            android:persistent="false"
-            />
-
     <PreferenceCategory
             android:key="profile_container"
             android:order="100"
diff --git a/src/com/android/settings/MasterClearConfirm.java b/src/com/android/settings/MasterClearConfirm.java
index 2ba1e7f..d14ad39 100644
--- a/src/com/android/settings/MasterClearConfirm.java
+++ b/src/com/android/settings/MasterClearConfirm.java
@@ -65,7 +65,10 @@
                     getActivity().getSystemService(Context.PERSISTENT_DATA_BLOCK_SERVICE);
 
             if (pdbManager != null) {
-                pdbManager.wipe();
+                // if OEM unlock is enabled, this will be wiped during FR process.
+                if (!pdbManager.getOemUnlockEnabled()) {
+                    pdbManager.wipe();
+                }
             }
 
             if (mEraseSdCard) {
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index e5f7736..1fb5e13 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -47,7 +47,9 @@
 import android.util.Log;
 
 import com.android.internal.widget.LockPatternUtils;
+import com.android.settings.TrustAgentUtils.TrustAgentComponentInfo;
 import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.search.Index;
 import com.android.settings.search.Indexable;
 import com.android.settings.search.SearchIndexableRaw;
 
@@ -76,6 +78,8 @@
     private static final String KEY_DEVICE_ADMIN_CATEGORY = "device_admin_category";
     private static final String KEY_LOCK_AFTER_TIMEOUT = "lock_after_timeout";
     private static final String KEY_OWNER_INFO_SETTINGS = "owner_info_settings";
+    private static final String KEY_ADVANCED_SECURITY = "advanced_security";
+    private static final String KEY_MANAGE_TRUST_AGENTS = "manage_trust_agents";
 
     private static final int SET_OR_CHANGE_LOCK_METHOD_REQUEST = 123;
     private static final int CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_IMPROVE_REQUEST = 124;
@@ -95,6 +99,9 @@
     private static final String KEY_TRUST_AGENT = "trust_agent";
     private static final String KEY_SCREEN_PINNING = "screen_pinning_settings";
 
+    // Only allow one trust agent on the platform.
+    private static final boolean ONLY_ONE_TRUST_AGENT = true;
+
     private DevicePolicyManager mDPM;
 
     private ChooseLockSettingsHelper mChooseLockSettingsHelper;
@@ -213,35 +220,23 @@
         // Trust Agent preferences
         PreferenceGroup securityCategory = (PreferenceGroup)
                 root.findPreference(KEY_SECURITY_CATEGORY);
-        if (securityCategory != null) {
-            PackageManager pm = getPackageManager();
-            List<ResolveInfo> resolveInfos = pm.queryIntentServices(TRUST_AGENT_INTENT,
-                    PackageManager.GET_META_DATA);
-            List<ComponentName> enabledTrustAgents = mLockPatternUtils.getEnabledTrustAgents();
-            if (enabledTrustAgents != null && !enabledTrustAgents.isEmpty()) {
-                for (ResolveInfo resolveInfo : resolveInfos) {
-                    if (resolveInfo.serviceInfo == null) continue;
-                    if (!TrustAgentUtils.checkProvidePermission(resolveInfo, pm)) continue;
-                    TrustAgentUtils.TrustAgentComponentInfo trustAgentComponentInfo =
-                            TrustAgentUtils.getSettingsComponent(pm, resolveInfo);
-                    if (trustAgentComponentInfo.componentName == null ||
-                            !enabledTrustAgents.contains(
-                                    TrustAgentUtils.getComponentName(resolveInfo)) ||
-                            TextUtils.isEmpty(trustAgentComponentInfo.title)) continue;
-                    Preference trustAgentPreference =
-                            new Preference(securityCategory.getContext());
-                    trustAgentPreference.setKey(KEY_TRUST_AGENT);
-                    trustAgentPreference.setTitle(trustAgentComponentInfo.title);
-                    trustAgentPreference.setSummary(trustAgentComponentInfo.summary);
-                    // Create intent for this preference.
-                    Intent intent = new Intent();
-                    intent.setComponent(trustAgentComponentInfo.componentName);
-                    intent.setAction(Intent.ACTION_MAIN);
-                    trustAgentPreference.setIntent(intent);
-                    // Add preference to the settings menu.
-                    securityCategory.addPreference(trustAgentPreference);
-                    break; // Only render the first one.
-                }
+        if (securityCategory != null && mLockPatternUtils.isSecure()) {
+            ArrayList<TrustAgentComponentInfo> agents =
+                    getActiveTrustAgents(getPackageManager(), mLockPatternUtils);
+            for (int i = 0; i < agents.size(); i++) {
+                final TrustAgentComponentInfo agent = agents.get(i);
+                Preference trustAgentPreference =
+                        new Preference(securityCategory.getContext());
+                trustAgentPreference.setKey(KEY_TRUST_AGENT);
+                trustAgentPreference.setTitle(agent.title);
+                trustAgentPreference.setSummary(agent.summary);
+                // Create intent for this preference.
+                Intent intent = new Intent();
+                intent.setComponent(agent.componentName);
+                intent.setAction(Intent.ACTION_MAIN);
+                trustAgentPreference.setIntent(intent);
+                // Add preference to the settings menu.
+                securityCategory.addPreference(trustAgentPreference);
             }
         }
 
@@ -341,9 +336,47 @@
             mToggleAppInstallation.setEnabled(false);
         }
 
+        // Advanced Security features
+        PreferenceGroup advancedCategory =
+                (PreferenceGroup)root.findPreference(KEY_ADVANCED_SECURITY);
+        if (advancedCategory != null && !mLockPatternUtils.isSecure()) {
+            Preference manageAgents = advancedCategory.findPreference(KEY_MANAGE_TRUST_AGENTS);
+            if (advancedCategory != null) advancedCategory.removePreference(manageAgents);
+        }
+
+        // The above preferences come and go based on security state, so we need to update
+        // the index. This call is expected to be fairly cheap, but we may want to do something
+        // smarter in the future.
+        Index.getInstance(getActivity())
+                .updateFromClassNameResource(SecuritySettings.class.getName(), true, true);
+
         return root;
     }
 
+    private static ArrayList<TrustAgentComponentInfo> getActiveTrustAgents(
+            PackageManager pm, LockPatternUtils utils) {
+        ArrayList<TrustAgentComponentInfo> result = new ArrayList<TrustAgentComponentInfo>();
+        List<ResolveInfo> resolveInfos = pm.queryIntentServices(TRUST_AGENT_INTENT,
+                PackageManager.GET_META_DATA);
+        List<ComponentName> enabledTrustAgents = utils.getEnabledTrustAgents();
+        if (enabledTrustAgents != null && !enabledTrustAgents.isEmpty()) {
+            for (int i = 0; i < resolveInfos.size(); i++) {
+                ResolveInfo resolveInfo = resolveInfos.get(i);
+                if (resolveInfo.serviceInfo == null) continue;
+                if (!TrustAgentUtils.checkProvidePermission(resolveInfo, pm)) continue;
+                TrustAgentComponentInfo trustAgentComponentInfo =
+                        TrustAgentUtils.getSettingsComponent(pm, resolveInfo);
+                if (trustAgentComponentInfo.componentName == null ||
+                        !enabledTrustAgents.contains(
+                                TrustAgentUtils.getComponentName(resolveInfo)) ||
+                        TextUtils.isEmpty(trustAgentComponentInfo.title)) continue;
+                result.add(trustAgentComponentInfo);
+                if (ONLY_ONE_TRUST_AGENT) break;
+            }
+        }
+        return result;
+    }
+
     private boolean isNonMarketAppsAllowed() {
         return Settings.Global.getInt(getContentResolver(),
                                       Settings.Global.INSTALL_NON_MARKET_APPS, 0) > 0;
@@ -626,7 +659,7 @@
     public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new SecuritySearchIndexProvider();
 
-    static private class SecuritySearchIndexProvider extends BaseSearchIndexProvider {
+    private static class SecuritySearchIndexProvider extends BaseSearchIndexProvider {
 
         boolean mIsPrimary;
 
@@ -716,6 +749,19 @@
                 result.add(data);
             }
 
+            // Advanced
+            final LockPatternUtils lockPatternUtils = new LockPatternUtils(context);
+            if (lockPatternUtils.isSecure()) {
+                ArrayList<TrustAgentComponentInfo> agents =
+                        getActiveTrustAgents(context.getPackageManager(), lockPatternUtils);
+                for (int i = 0; i < agents.size(); i++) {
+                    final TrustAgentComponentInfo agent = agents.get(i);
+                    data = new SearchIndexableRaw(context);
+                    data.title = agent.title;
+                    data.screenTitle = screenTitle;
+                    result.add(data);
+                }
+            }
             return result;
         }
 
@@ -745,6 +791,12 @@
                 keys.add(KEY_CREDENTIALS_MANAGER);
             }
 
+            // TrustAgent settings disappear when the user has no primary security.
+            if (!lockPatternUtils.isSecure()) {
+                keys.add(KEY_TRUST_AGENT);
+                keys.add(KEY_MANAGE_TRUST_AGENTS);
+            }
+
             return keys;
         }
     }
diff --git a/src/com/android/settings/bluetooth/BluetoothSettings.java b/src/com/android/settings/bluetooth/BluetoothSettings.java
index f1125bc..7441c8c 100755
--- a/src/com/android/settings/bluetooth/BluetoothSettings.java
+++ b/src/com/android/settings/bluetooth/BluetoothSettings.java
@@ -18,28 +18,39 @@
 
 import static android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH;
 
+import android.app.Activity;
+import android.app.AlertDialog;
 import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothDevice;
 import android.content.BroadcastReceiver;
 import android.content.Context;
+import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.res.Resources;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
 import android.os.Bundle;
 import android.preference.Preference;
 import android.preference.PreferenceCategory;
+import android.preference.PreferenceFragment;
 import android.preference.PreferenceGroup;
 import android.preference.PreferenceScreen;
 import android.util.Log;
+import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.widget.EditText;
 import android.widget.TextView;
 
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.search.Index;
 import com.android.settings.search.Indexable;
 import com.android.settings.search.SearchIndexableRaw;
 import com.android.settings.widget.SwitchBar;
@@ -64,6 +75,8 @@
     private static final String BTOPP_ACTION_OPEN_RECEIVED_FILES =
             "android.btopp.intent.action.OPEN_RECEIVED_FILES";
 
+    private static View mSettingsDialogView = null;
+
     private BluetoothEnabler mBluetoothEnabler;
 
     private PreferenceGroup mPairedDevicesCategory;
@@ -371,20 +384,60 @@
     private final View.OnClickListener mDeviceProfilesListener = new View.OnClickListener() {
         public void onClick(View v) {
             // User clicked on advanced options icon for a device in the list
-            if (v.getTag() instanceof CachedBluetoothDevice) {
-                if (isUiRestricted()) return;
-
-                CachedBluetoothDevice device = (CachedBluetoothDevice) v.getTag();
-
-                Bundle args = new Bundle(1);
-                args.putParcelable(DeviceProfilesSettings.EXTRA_DEVICE, device.getDevice());
-
-                ((SettingsActivity) getActivity()).startPreferencePanel(
-                        DeviceProfilesSettings.class.getName(), args,
-                        R.string.bluetooth_device_advanced_title, null, null, 0);
-            } else {
-                Log.w(TAG, "onClick() called for other View: " + v); // TODO remove
+            if (!(v.getTag() instanceof CachedBluetoothDevice)) {
+                Log.w(TAG, "onClick() called for other View: " + v);
+                return;
             }
+
+            final CachedBluetoothDevice device = (CachedBluetoothDevice) v.getTag();
+            final Activity activity = getActivity();
+            DeviceProfilesSettings profileFrag = (DeviceProfilesSettings)activity.
+                getFragmentManager().findFragmentById(R.id.bluetooth_fragment_settings);
+
+            if (mSettingsDialogView != null){
+                ViewGroup parent = (ViewGroup) mSettingsDialogView.getParent();
+                if (parent != null) {
+                    parent.removeView(mSettingsDialogView);
+                }
+            }
+            if (profileFrag == null) {
+                LayoutInflater inflater = getActivity().getLayoutInflater();
+                mSettingsDialogView = inflater.inflate(R.layout.bluetooth_device_picker, null);
+                profileFrag = (DeviceProfilesSettings)activity.getFragmentManager()
+                .findFragmentById(R.id.bluetooth_fragment_settings);
+            }
+
+            final View dialogLayout = mSettingsDialogView;
+            AlertDialog.Builder settingsDialog = new AlertDialog.Builder(activity);
+            profileFrag.setDevice(device);
+            final EditText deviceName = (EditText)dialogLayout.findViewById(R.id.name);
+            deviceName.setText(device.getName(), TextView.BufferType.EDITABLE);
+            settingsDialog.setView(dialogLayout);
+            settingsDialog.setTitle(R.string.bluetooth_preference_paired_devices);
+            settingsDialog.setPositiveButton(R.string.okay,
+                    new DialogInterface.OnClickListener() {
+                @Override
+                public void onClick(DialogInterface dialog, int which) {
+                    EditText deviceName = (EditText)dialogLayout.findViewById(R.id.name);
+                    device.setName(deviceName.getText().toString());
+                }
+            });
+            final Context context = v.getContext();
+            settingsDialog.setNegativeButton(R.string.forget,
+                    new DialogInterface.OnClickListener() {
+                @Override
+                public void onClick(DialogInterface dialog, int which) {
+                    device.unpair();
+                    com.android.settings.bluetooth.Utils.updateSearchIndex(activity,
+                            BluetoothSettings.class.getName(), device.getName(),
+                            context.getResources().getString(R.string.bluetooth_settings),
+                            R.drawable.ic_settings_bluetooth2, false);
+                }
+            });
+
+            AlertDialog dialog = settingsDialog.create();
+            dialog.create();
+            dialog.show();
         }
     };
 
diff --git a/src/com/android/settings/bluetooth/DeviceProfilesSettings.java b/src/com/android/settings/bluetooth/DeviceProfilesSettings.java
index fb7668f..ea43bad 100755
--- a/src/com/android/settings/bluetooth/DeviceProfilesSettings.java
+++ b/src/com/android/settings/bluetooth/DeviceProfilesSettings.java
@@ -17,6 +17,7 @@
 package com.android.settings.bluetooth;
 
 import android.app.AlertDialog;
+import android.app.Fragment;
 import android.bluetooth.BluetoothDevice;
 import android.bluetooth.BluetoothProfile;
 import android.content.Context;
@@ -36,6 +37,7 @@
 import android.app.Dialog;
 import android.widget.Button;
 import android.text.Editable;
+
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.search.Index;
@@ -52,15 +54,14 @@
         implements CachedBluetoothDevice.Callback, Preference.OnPreferenceChangeListener {
     private static final String TAG = "DeviceProfilesSettings";
 
-    private static final String KEY_RENAME_DEVICE = "rename_device";
     private static final String KEY_PROFILE_CONTAINER = "profile_container";
     private static final String KEY_UNPAIR = "unpair";
     private static final String KEY_PBAP_SERVER = "PBAP Server";
 
     public static final String EXTRA_DEVICE = "device";
-    private RenameEditTextPreference mRenameDeviceNamePref;
-    private LocalBluetoothManager mManager;
+
     private CachedBluetoothDevice mCachedDevice;
+    private LocalBluetoothManager mManager;
     private LocalBluetoothProfileManager mProfileManager;
 
     private PreferenceGroup mProfileContainer;
@@ -72,66 +73,18 @@
     private AlertDialog mDisconnectDialog;
     private boolean mProfileGroupIsRemoved;
 
-    private class RenameEditTextPreference implements TextWatcher{
-        public void afterTextChanged(Editable s) {
-            Dialog d = mDeviceNamePref.getDialog();
-            if (d instanceof AlertDialog) {
-                ((AlertDialog) d).getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(s.length() > 0);
-            }
-        }
-
-        // TextWatcher interface
-        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
-            // not used
-        }
-
-        // TextWatcher interface
-        public void onTextChanged(CharSequence s, int start, int before, int count) {
-            // not used
-        }
-    }
-
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
-        BluetoothDevice device;
-        if (savedInstanceState != null) {
-            device = savedInstanceState.getParcelable(EXTRA_DEVICE);
-        } else {
-            Bundle args = getArguments();
-            device = args.getParcelable(EXTRA_DEVICE);
-        }
-
         addPreferencesFromResource(R.xml.bluetooth_device_advanced);
         getPreferenceScreen().setOrderingAsAdded(false);
         mProfileContainer = (PreferenceGroup) findPreference(KEY_PROFILE_CONTAINER);
-        mDeviceNamePref = (EditTextPreference) findPreference(KEY_RENAME_DEVICE);
 
-        if (device == null) {
-            Log.w(TAG, "Activity started without a remote Bluetooth device");
-            finish();
-            return;  // TODO: test this failure path
-        }
-        mRenameDeviceNamePref = new RenameEditTextPreference();
         mManager = LocalBluetoothManager.getInstance(getActivity());
         CachedBluetoothDeviceManager deviceManager =
                 mManager.getCachedDeviceManager();
         mProfileManager = mManager.getProfileManager();
-        mCachedDevice = deviceManager.findDevice(device);
-        if (mCachedDevice == null) {
-            Log.w(TAG, "Device not found, cannot connect to it");
-            finish();
-            return;  // TODO: test this failure path
-        }
-
-        String deviceName = mCachedDevice.getName();
-        mDeviceNamePref.setSummary(deviceName);
-        mDeviceNamePref.setText(deviceName);
-        mDeviceNamePref.setOnPreferenceChangeListener(this);
-
-        // Add a preference for each profile
-        addPreferencesForProfiles();
     }
 
     @Override
@@ -141,6 +94,9 @@
             mDisconnectDialog.dismiss();
             mDisconnectDialog = null;
         }
+        if (mCachedDevice != null) {
+            mCachedDevice.unregisterCallback(this);
+        }
     }
 
     @Override
@@ -154,18 +110,13 @@
         super.onResume();
 
         mManager.setForegroundActivity(getActivity());
-        mCachedDevice.registerCallback(this);
-        if(mCachedDevice.getBondState() == BluetoothDevice.BOND_NONE)
-            finish();
-        refresh();
-        EditText et = mDeviceNamePref.getEditText();
-        if (et != null) {
-            et.addTextChangedListener(mRenameDeviceNamePref);
-            Dialog d = mDeviceNamePref.getDialog();
-            if (d instanceof AlertDialog) {
-                Button b = ((AlertDialog) d).getButton(AlertDialog.BUTTON_POSITIVE);
-                b.setEnabled(et.getText().length() > 0);
+        if (mCachedDevice != null) {
+            mCachedDevice.registerCallback(this);
+            if (mCachedDevice.getBondState() == BluetoothDevice.BOND_NONE) {
+                finish();
+                return;
             }
+            refresh();
         }
     }
 
@@ -173,11 +124,23 @@
     public void onPause() {
         super.onPause();
 
-        mCachedDevice.unregisterCallback(this);
+        if (mCachedDevice != null) {
+            mCachedDevice.unregisterCallback(this);
+        }
+
         mManager.setForegroundActivity(null);
     }
 
+    public void setDevice(CachedBluetoothDevice cachedDevice) {
+        mCachedDevice = cachedDevice;
+
+        mCachedDevice.registerCallback(this);
+        addPreferencesForProfiles();
+        refresh();
+    }
+
     private void addPreferencesForProfiles() {
+        mProfileContainer.removeAll();
         for (LocalBluetoothProfile profile : mCachedDevice.getConnectableProfiles()) {
             Preference pref = createProfilePreference(profile);
             mProfileContainer.addPreference(pref);
@@ -238,28 +201,6 @@
         return pref;
     }
 
-    @Override
-    public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
-        String key = preference.getKey();
-        if (key.equals(KEY_UNPAIR)) {
-            unpairDevice();
-            finish();
-            final Context context = preference.getContext();
-
-            SearchIndexableRaw data = new SearchIndexableRaw(context);
-            data.className = BluetoothSettings.class.getName();
-            data.title = mCachedDevice.getName();
-            data.screenTitle = context.getResources().getString(R.string.bluetooth_settings);
-            data.iconResId = R.drawable.ic_settings_bluetooth2;
-            data.enabled = false;
-
-            Index.getInstance(context).updateFromSearchIndexableData(data);
-            return true;
-        }
-
-        return super.onPreferenceTreeClick(screen, preference);
-    }
-
     public boolean onPreferenceChange(Preference preference, Object newValue) {
         if (preference == mDeviceNamePref) {
             mCachedDevice.setName((String) newValue);
@@ -331,14 +272,16 @@
                 mDisconnectDialog, disconnectListener, title, Html.fromHtml(message));
     }
 
+    @Override
     public void onDeviceAttributesChanged() {
         refresh();
     }
 
     private void refresh() {
-        String deviceName = mCachedDevice.getName();
-        mDeviceNamePref.setSummary(deviceName);
-        mDeviceNamePref.setText(deviceName);
+        final EditText deviceNameField = (EditText) getView().findViewById(R.id.name);
+        if (deviceNameField != null) {
+            deviceNameField.setText(mCachedDevice.getName());
+        }
 
         refreshProfiles();
     }
@@ -391,8 +334,4 @@
     private int getProfilePreferenceIndex(int profIndex) {
         return mProfileContainer.getOrder() + profIndex * 10;
     }
-
-    private void unpairDevice() {
-        mCachedDevice.unpair();
-    }
 }
diff --git a/src/com/android/settings/bluetooth/Utils.java b/src/com/android/settings/bluetooth/Utils.java
index 1970400..e9230de 100755
--- a/src/com/android/settings/bluetooth/Utils.java
+++ b/src/com/android/settings/bluetooth/Utils.java
@@ -24,6 +24,8 @@
 import android.widget.Toast;
 
 import com.android.settings.R;
+import com.android.settings.search.Index;
+import com.android.settings.search.SearchIndexableRaw;
 
 /**
  * Utils is a helper class that contains constants for various
@@ -101,4 +103,19 @@
             Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
         }
     }
+
+    /**
+     * Update the search Index for a specific class name and resources.
+     */
+    public static void updateSearchIndex(Context context, String className, String title,
+            String screenTitle, int iconResId, boolean enabled) {
+        SearchIndexableRaw data = new SearchIndexableRaw(context);
+        data.className = className;
+        data.title = title;
+        data.screenTitle = screenTitle;
+        data.iconResId = iconResId;
+        data.enabled = enabled;
+
+        Index.getInstance(context).updateFromSearchIndexableData(data);
+    }
 }
diff --git a/src/com/android/settings/fuelgauge/BatteryHistoryDetail.java b/src/com/android/settings/fuelgauge/BatteryHistoryDetail.java
index 248d471..63e4e13 100644
--- a/src/com/android/settings/fuelgauge/BatteryHistoryDetail.java
+++ b/src/com/android/settings/fuelgauge/BatteryHistoryDetail.java
@@ -18,31 +18,27 @@
 
 import android.app.Fragment;
 import android.content.Intent;
+import android.os.BatteryStats;
 import android.os.Bundle;
-import android.os.Parcel;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 
-import com.android.internal.os.BatteryStatsImpl;
+import com.android.internal.os.BatteryStatsHelper;
 import com.android.settings.R;
 
 public class BatteryHistoryDetail extends Fragment {
     public static final String EXTRA_STATS = "stats";
     public static final String EXTRA_BROADCAST = "broadcast";
 
-    private BatteryStatsImpl mStats;
+    private BatteryStats mStats;
     private Intent mBatteryBroadcast;
 
     @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
-        byte[] data = getArguments().getByteArray(EXTRA_STATS);
-        Parcel parcel = Parcel.obtain();
-        parcel.unmarshall(data, 0, data.length);
-        parcel.setDataPosition(0);
-        mStats = com.android.internal.os.BatteryStatsImpl.CREATOR
-                .createFromParcel(parcel);
+        String histFile = getArguments().getString(EXTRA_STATS);
+        mStats = BatteryStatsHelper.statsFromFile(getActivity(), histFile);
         mBatteryBroadcast = getArguments().getParcelable(EXTRA_BROADCAST);
     }
     
diff --git a/src/com/android/settings/fuelgauge/BatteryHistoryPreference.java b/src/com/android/settings/fuelgauge/BatteryHistoryPreference.java
index 300b98f..e7326b1 100644
--- a/src/com/android/settings/fuelgauge/BatteryHistoryPreference.java
+++ b/src/com/android/settings/fuelgauge/BatteryHistoryPreference.java
@@ -47,8 +47,6 @@
         setLayoutResource(R.layout.preference_batteryhistory);
         mStats = stats;
         mBatteryBroadcast = batteryBroadcast;
-        // Make it non selectable
-        setSelectable(false);
     }
 
     BatteryStats getStats() {
diff --git a/src/com/android/settings/fuelgauge/PowerGaugePreference.java b/src/com/android/settings/fuelgauge/PowerGaugePreference.java
index 8157b5d..a558533 100644
--- a/src/com/android/settings/fuelgauge/PowerGaugePreference.java
+++ b/src/com/android/settings/fuelgauge/PowerGaugePreference.java
@@ -34,9 +34,9 @@
     private BatteryEntry mInfo;
     private int mProgress;
     private CharSequence mProgressText;
-    private final String mContentDescription;
+    private final CharSequence mContentDescription;
 
-    public PowerGaugePreference(Context context, Drawable icon, String contentDescription,
+    public PowerGaugePreference(Context context, Drawable icon, CharSequence contentDescription,
             BatteryEntry info) {
         super(context);
         setLayoutResource(R.layout.preference_app_percentage);
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index e6534eb..ad8afa5 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -26,7 +26,6 @@
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
-import android.os.Parcel;
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.preference.Preference;
@@ -46,8 +45,6 @@
 import com.android.settings.SettingsActivity;
 
 import java.util.List;
-import java.util.ArrayList;
-import java.util.Collections;
 
 /**
  * Displays a list of apps and subsystems that consume power, ordered by how much power was
@@ -61,6 +58,8 @@
 
     private static final String KEY_APP_LIST = "app_list";
 
+    private static final String BATTERY_HISTORY_FILE = "tmp_bat_history.bin";
+
     private static final int MENU_STATS_TYPE = Menu.FIRST;
     private static final int MENU_STATS_REFRESH = Menu.FIRST + 1;
     private static final int MENU_BATTERY_SAVER = Menu.FIRST + 2;
@@ -116,6 +115,7 @@
     @Override
     public void onResume() {
         super.onResume();
+        BatteryStatsHelper.dropFile(getActivity(), BATTERY_HISTORY_FILE);
         updateBatteryStatus(getActivity().registerReceiver(mBatteryInfoReceiver,
                 new IntentFilter(Intent.ACTION_BATTERY_CHANGED)));
         if (mHandler.hasMessages(MSG_REFRESH_STATS)) {
@@ -151,11 +151,9 @@
     @Override
     public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
         if (preference instanceof BatteryHistoryPreference) {
-            Parcel hist = Parcel.obtain();
-            mStatsHelper.getStats().writeToParcelWithoutUids(hist, 0);
-            byte[] histData = hist.marshall();
+            mStatsHelper.storeStatsHistoryInFile(BATTERY_HISTORY_FILE);
             Bundle args = new Bundle();
-            args.putByteArray(BatteryHistoryDetail.EXTRA_STATS, histData);
+            args.putString(BatteryHistoryDetail.EXTRA_STATS, BATTERY_HISTORY_FILE);
             args.putParcelable(BatteryHistoryDetail.EXTRA_BROADCAST,
                     mStatsHelper.getBatteryBroadcast());
             SettingsActivity sa = (SettingsActivity) getActivity();
@@ -297,9 +295,7 @@
                 final BatteryEntry entry = new BatteryEntry(getActivity(), mHandler, mUm, sipper);
                 final Drawable badgedIcon = mUm.getBadgedDrawableForUser(entry.getIcon(),
                         userHandle);
-                // TODO: type of this will be replaced by CharSequence (see
-                // https://b.corp.google.com/issue?id=16401636 )
-                final String contentDescription = mUm.getBadgedLabelForUser(entry.getLabel(),
+                final CharSequence contentDescription = mUm.getBadgedLabelForUser(entry.getLabel(),
                         userHandle);
                 final PowerGaugePreference pref = new PowerGaugePreference(getActivity(),
                         badgedIcon, contentDescription, entry);
diff --git a/src/com/android/settings/location/RecentLocationApps.java b/src/com/android/settings/location/RecentLocationApps.java
index 5506181..13d282d 100644
--- a/src/com/android/settings/location/RecentLocationApps.java
+++ b/src/com/android/settings/location/RecentLocationApps.java
@@ -82,9 +82,9 @@
      * them for accessibility purposes.
      */
     private static class AccessiblePreference extends Preference {
-        public String mContentDescription;
+        public CharSequence mContentDescription;
 
-        public AccessiblePreference(Context context, String contentDescription) {
+        public AccessiblePreference(Context context, CharSequence contentDescription) {
             super(context);
             mContentDescription = contentDescription;
         }
@@ -103,7 +103,7 @@
             Drawable icon,
             CharSequence label,
             boolean isHighBattery,
-            String contentDescription,
+            CharSequence contentDescription,
             Preference.OnPreferenceClickListener listener) {
         AccessiblePreference pref = new AccessiblePreference(mActivity, contentDescription);
         pref.setIcon(icon);
@@ -209,7 +209,7 @@
             Drawable appIcon = mPackageManager.getApplicationIcon(appInfo);
             Drawable icon = um.getBadgedDrawableForUser(appIcon, userHandle);
             CharSequence appLabel = mPackageManager.getApplicationLabel(appInfo);
-            String badgedAppLabel = um.getBadgedLabelForUser(appLabel.toString(), userHandle);
+            CharSequence badgedAppLabel = um.getBadgedLabelForUser(appLabel.toString(), userHandle);
             preference = createRecentLocationEntry(icon,
                     appLabel, highBattery, badgedAppLabel,
                     new PackageEntryClickedListener(packageName));
diff --git a/src/com/android/settings/nfc/PaymentDefaultDialog.java b/src/com/android/settings/nfc/PaymentDefaultDialog.java
index 6bc29e1..33ac947 100644
--- a/src/com/android/settings/nfc/PaymentDefaultDialog.java
+++ b/src/com/android/settings/nfc/PaymentDefaultDialog.java
@@ -34,6 +34,7 @@
         DialogInterface.OnClickListener {
 
     public static final String TAG = "PaymentDefaultDialog";
+    private static final int PAYMENT_APP_MAX_CAPTION_LENGTH = 40;
 
     private PaymentBackend mBackend;
     private ComponentName mNewDefault;
@@ -109,12 +110,14 @@
         p.mTitle = getString(R.string.nfc_payment_set_default_label);
         if (defaultPaymentApp == null) {
             String formatString = getString(R.string.nfc_payment_set_default);
-            String msg = String.format(formatString, requestedPaymentApp.caption);
+            String msg = String.format(formatString,
+                    sanitizePaymentAppCaption(requestedPaymentApp.caption.toString()));
             p.mMessage = msg;
         } else {
             String formatString = getString(R.string.nfc_payment_set_default_instead_of);
-            String msg = String.format(formatString, requestedPaymentApp.caption,
-                    defaultPaymentApp.caption);
+            String msg = String.format(formatString,
+                    sanitizePaymentAppCaption(requestedPaymentApp.caption.toString()),
+                    sanitizePaymentAppCaption(defaultPaymentApp.caption.toString()));
             p.mMessage = msg;
         }
         p.mPositiveButtonText = getString(R.string.yes);
@@ -126,4 +129,15 @@
         return true;
     }
 
+    private String sanitizePaymentAppCaption(String input) {
+        String sanitizedString = input.replace('\n', ' ').replace('\r', ' ').trim();
+
+
+        if (sanitizedString.length() > PAYMENT_APP_MAX_CAPTION_LENGTH) {
+            return sanitizedString.substring(0, PAYMENT_APP_MAX_CAPTION_LENGTH);
+        }
+
+        return sanitizedString;
+    }
+
 }
diff --git a/src/com/android/settings/sim/SimSettings.java b/src/com/android/settings/sim/SimSettings.java
index 2e1c0f5..15c5548 100644
--- a/src/com/android/settings/sim/SimSettings.java
+++ b/src/com/android/settings/sim/SimSettings.java
@@ -273,8 +273,6 @@
                     // SubscriptionManager.setDefaultSMSSubId(subId);
                 }
 
-                updateAllOptions();
-
                 return true;
             }
         });
@@ -357,6 +355,7 @@
                         mSubInfoRecord.mSubId);
 
                     updateAllOptions();
+                    update();
                 }
             });