Merge "Fix memory leak in ApnSettings-activity"
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index c6fc4d4..3f5b978 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -771,6 +771,7 @@
     <string name="sd_format" product="default" msgid="2576054280507119870">"格式化 SD 卡"</string>
     <string name="sd_format_summary" product="nosdcard" msgid="6331905044907914603">"清除内部 USB 存储设备中的全部数据,例如音乐和照片"</string>
     <string name="sd_format_summary" product="default" msgid="212703692181793109">"清除 SD 卡中的全部数据,例如音乐和照片"</string>
+    <string name="mtp_ptp_mode_summary">正在使用媒体设备(MTP)或相机(PTP)传输模式</string>
     <string name="read_only" msgid="6702420168629076340">" (只读)"</string>
     <string name="dlg_confirm_unmount_title" product="nosdcard" msgid="3077285629197874055">"要卸载 USB 存储设备吗?"</string>
     <string name="dlg_confirm_unmount_title" product="default" msgid="3634502237262534381">"要卸载 SD 卡吗?"</string>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 5a774f0..e9121fc 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1433,6 +1433,8 @@
     <string name="wifi_p2p_menu_rename">Rename device</string>
     <!-- Title for available p2p devices -->
     <string name="wifi_p2p_peer_devices">Peer devices</string>
+    <!-- Title for remembered p2p groups -->
+    <string name="wifi_p2p_remembered_groups">Remembered groups</string>
     <!-- Toast text for a failed connection initiation -->
     <string name="wifi_p2p_failed_connect_message">Couldn\'t connect.</string>
     <!-- Message text for failure to rename -->
@@ -1447,6 +1449,10 @@
     <string name="wifi_p2p_cancel_connect_title">Cancel invitation?</string>
     <!-- Message text for disconnection from one device-->
     <string name="wifi_p2p_cancel_connect_message">Do you want to cancel invitation to connect with <xliff:g id="peer_name">%1$s</xliff:g>?</string>
+    <!-- Title for delete group dialog -->
+    <string name="wifi_p2p_delete_group_title">Delete group?</string>
+    <!-- Message text for remembered group deletion-->
+    <string name="wifi_p2p_delete_group_message">Do you want to delete the group <xliff:g id="group_name">%1$s</xliff:g>?</string>
 
     <!-- Wifi AP settings-->
     <!-- Label for wifi tether checkbox. Toggles Access Point on/off -->
@@ -1898,6 +1904,10 @@
     <!-- SD card & phone storage settings item title that will result in the phone unmounting the SD card.   [CHAR LIMIT=80] -->
     <string name="sd_format_summary" product="default">Erases all data on the SD card, such as music and photos</string>
     <!-- SD card status when it is mounted as read only. Will be appended to size, starts with an unbreakable space -->
+
+    <!-- SD card & phone storage settings item summary that will result in the phone connected to PC and MTP/PTP enabled.   [CHAR LIMIT=80] -->
+    <string name="mtp_ptp_mode_summary">MTP or PTP function is active</string>
+
     <string name="read_only">\u0020(Read-only)</string>
     <!-- SD card eject confirmation dialog title   [CHAR LIMIT=25] -->
     <string name="dlg_confirm_unmount_title" product="nosdcard">Unmount USB storage?</string>
diff --git a/src/com/android/settings/AccessibilitySettings.java b/src/com/android/settings/AccessibilitySettings.java
index 6167f78..8cb04cc 100644
--- a/src/com/android/settings/AccessibilitySettings.java
+++ b/src/com/android/settings/AccessibilitySettings.java
@@ -179,9 +179,9 @@
         super.onResume();
         loadInstalledServices();
         updateAllPreferences();
-        if (mServicesCategory.getPreference(0) == mNoServicesMessagePreference) {
-            offerInstallAccessibilitySerivceOnce();
-        }
+
+        offerInstallAccessibilitySerivceOnce();
+
         mSettingsPackageMonitor.register(getActivity(), getActivity().getMainLooper(), false);
         RotationPolicy.registerRotationPolicyListener(getActivity(),
                 mRotationPolicyListener);
@@ -465,6 +465,17 @@
         final boolean offerInstallService = !preferences.getBoolean(
                 KEY_INSTALL_ACCESSIBILITY_SERVICE_OFFERED_ONCE, false);
         if (offerInstallService) {
+            String screenreaderMarketLink = SystemProperties.get(
+                    SYSTEM_PROPERTY_MARKET_URL,
+                    DEFAULT_SCREENREADER_MARKET_LINK);
+            Uri marketUri = Uri.parse(screenreaderMarketLink);
+            Intent marketIntent = new Intent(Intent.ACTION_VIEW, marketUri);
+
+            if (getPackageManager().resolveActivity(marketIntent, 0) == null) {
+                // Don't show the dialog if no market app is found/installed.
+                return;
+            }
+
             preferences.edit().putBoolean(KEY_INSTALL_ACCESSIBILITY_SERVICE_OFFERED_ONCE,
                     true).commit();
             // Notify user that they do not have any accessibility
@@ -766,7 +777,7 @@
             }
             return new AlertDialog.Builder(getActivity())
                 .setTitle(title)
-                .setIcon(android.R.drawable.ic_dialog_alert)
+                .setIconAttribute(android.R.attr.alertDialogIcon)
                 .setMessage(message)
                 .setCancelable(true)
                 .setPositiveButton(android.R.string.ok, this)
diff --git a/src/com/android/settings/ApnEditor.java b/src/com/android/settings/ApnEditor.java
index bca521b..79b6d15 100644
--- a/src/com/android/settings/ApnEditor.java
+++ b/src/com/android/settings/ApnEditor.java
@@ -167,15 +167,7 @@
         mProtocol.setOnPreferenceChangeListener(this);
 
         mRoamingProtocol = (ListPreference) findPreference(KEY_ROAMING_PROTOCOL);
-        // Only enable this on CDMA phones for now, since it may cause problems on other phone
-        // types.  (This screen is not normally accessible on CDMA phones, but is useful for
-        // testing.)
-        TelephonyManager tm = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
-        if (tm.getCurrentPhoneType() == PhoneConstants.PHONE_TYPE_CDMA) {
-            mRoamingProtocol.setOnPreferenceChangeListener(this);
-        } else {
-            getPreferenceScreen().removePreference(mRoamingProtocol);
-        }
+        mRoamingProtocol.setOnPreferenceChangeListener(this);
 
         mCarrierEnabled = (CheckBoxPreference) findPreference(KEY_CARRIER_ENABLED);
 
diff --git a/src/com/android/settings/BandMode.java b/src/com/android/settings/BandMode.java
index 4c7663e..0a0f77f 100644
--- a/src/com/android/settings/BandMode.java
+++ b/src/com/android/settings/BandMode.java
@@ -207,7 +207,9 @@
                             Window.FEATURE_INDETERMINATE_PROGRESS,
                             Window.PROGRESS_VISIBILITY_OFF);
 
-                    displayBandSelectionResult(ar.exception);
+                    if (!isFinishing()) {
+                        displayBandSelectionResult(ar.exception);
+                    }
                     break;
             }
         }
diff --git a/src/com/android/settings/CredentialStorage.java b/src/com/android/settings/CredentialStorage.java
index c12d06c..07b1776 100644
--- a/src/com/android/settings/CredentialStorage.java
+++ b/src/com/android/settings/CredentialStorage.java
@@ -235,7 +235,7 @@
         private ResetDialog() {
             AlertDialog dialog = new AlertDialog.Builder(CredentialStorage.this)
                     .setTitle(android.R.string.dialog_alert_title)
-                    .setIcon(android.R.drawable.ic_dialog_alert)
+                    .setIconAttribute(android.R.attr.alertDialogIcon)
                     .setMessage(R.string.credentials_reset_hint)
                     .setPositiveButton(android.R.string.ok, this)
                     .setNegativeButton(android.R.string.cancel, this)
@@ -305,7 +305,7 @@
         private ConfigureKeyGuardDialog() {
             AlertDialog dialog = new AlertDialog.Builder(CredentialStorage.this)
                     .setTitle(android.R.string.dialog_alert_title)
-                    .setIcon(android.R.drawable.ic_dialog_alert)
+                    .setIconAttribute(android.R.attr.alertDialogIcon)
                     .setMessage(R.string.credentials_configure_lock_screen_hint)
                     .setPositiveButton(android.R.string.ok, this)
                     .setNegativeButton(android.R.string.cancel, this)
diff --git a/src/com/android/settings/CryptKeeperSettings.java b/src/com/android/settings/CryptKeeperSettings.java
index ce3ad9d..d0043e6 100644
--- a/src/com/android/settings/CryptKeeperSettings.java
+++ b/src/com/android/settings/CryptKeeperSettings.java
@@ -91,7 +91,7 @@
                 // TODO replace (or follow) this dialog with an explicit launch into password UI
                 new AlertDialog.Builder(getActivity())
                     .setTitle(R.string.crypt_keeper_dialog_need_password_title)
-                    .setIcon(android.R.drawable.ic_dialog_alert)
+                    .setIconAttribute(android.R.attr.alertDialogIcon)
                     .setMessage(R.string.crypt_keeper_dialog_need_password_message)
                     .setPositiveButton(android.R.string.ok, null)
                     .create()
diff --git a/src/com/android/settings/DevelopmentSettings.java b/src/com/android/settings/DevelopmentSettings.java
index f5789ae..46ffe83 100644
--- a/src/com/android/settings/DevelopmentSettings.java
+++ b/src/com/android/settings/DevelopmentSettings.java
@@ -757,7 +757,7 @@
                             getActivity().getResources().getString(
                                     R.string.dev_settings_warning_message))
                             .setTitle(R.string.dev_settings_warning_title)
-                            .setIcon(android.R.drawable.ic_dialog_alert)
+                            .setIconAttribute(android.R.attr.alertDialogIcon)
                             .setPositiveButton(android.R.string.yes, this)
                             .setNegativeButton(android.R.string.no, this)
                             .show();
@@ -800,7 +800,7 @@
                 mAdbDialog = new AlertDialog.Builder(getActivity()).setMessage(
                         getActivity().getResources().getString(R.string.adb_warning_message))
                         .setTitle(R.string.adb_warning_title)
-                        .setIcon(android.R.drawable.ic_dialog_alert)
+                        .setIconAttribute(android.R.attr.alertDialogIcon)
                         .setPositiveButton(android.R.string.yes, this)
                         .setNegativeButton(android.R.string.no, this)
                         .show();
diff --git a/src/com/android/settings/IccLockSettings.java b/src/com/android/settings/IccLockSettings.java
index 755be83..ab12587 100644
--- a/src/com/android/settings/IccLockSettings.java
+++ b/src/com/android/settings/IccLockSettings.java
@@ -348,7 +348,8 @@
         // reset dialog state. Else inject error message and show dialog again.
         Message callback = Message.obtain(mHandler, MSG_ENABLE_ICC_PIN_COMPLETE);
         mPhone.getIccCard().setIccLockEnabled(mToState, mPin, callback);
-
+        // Disable the setting till the response is received.
+        mPinToggle.setEnabled(false);
     }
 
     private void iccLockChanged(boolean success) {
@@ -358,6 +359,7 @@
             Toast.makeText(this, mRes.getString(R.string.sim_lock_failed), Toast.LENGTH_SHORT)
                     .show();
         }
+        mPinToggle.setEnabled(true);
         resetDialogState();
     }
 
diff --git a/src/com/android/settings/PrivacySettings.java b/src/com/android/settings/PrivacySettings.java
index e2433bd..d936f46 100644
--- a/src/com/android/settings/PrivacySettings.java
+++ b/src/com/android/settings/PrivacySettings.java
@@ -119,7 +119,7 @@
         // TODO: DialogFragment?
         mConfirmDialog = new AlertDialog.Builder(getActivity()).setMessage(msg)
                 .setTitle(R.string.backup_erase_dialog_title)
-                .setIcon(android.R.drawable.ic_dialog_alert)
+                .setIconAttribute(android.R.attr.alertDialogIcon)
                 .setPositiveButton(android.R.string.ok, this)
                 .setNegativeButton(android.R.string.cancel, this)
                 .show();
diff --git a/src/com/android/settings/TetherSettings.java b/src/com/android/settings/TetherSettings.java
index 77a72a7..4a79eca 100644
--- a/src/com/android/settings/TetherSettings.java
+++ b/src/com/android/settings/TetherSettings.java
@@ -493,8 +493,8 @@
     private void setUsbTethering(boolean enabled) {
         ConnectivityManager cm =
             (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
+        mUsbTether.setChecked(false);
         if (cm.setUsbTethering(enabled) != ConnectivityManager.TETHER_ERROR_NO_ERROR) {
-            mUsbTether.setChecked(false);
             mUsbTether.setSummary(R.string.usb_tethering_errored_subtext);
             return;
         }
diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java
index d85c341..7fe3711 100644
--- a/src/com/android/settings/applications/InstalledAppDetails.java
+++ b/src/com/android/settings/applications/InstalledAppDetails.java
@@ -815,7 +815,7 @@
                 case DLG_CLEAR_DATA:
                     return new AlertDialog.Builder(getActivity())
                     .setTitle(getActivity().getText(R.string.clear_data_dlg_title))
-                    .setIcon(android.R.drawable.ic_dialog_alert)
+                    .setIconAttribute(android.R.attr.alertDialogIcon)
                     .setMessage(getActivity().getText(R.string.clear_data_dlg_text))
                     .setPositiveButton(R.string.dlg_ok,
                             new DialogInterface.OnClickListener() {
@@ -829,7 +829,7 @@
                 case DLG_FACTORY_RESET:
                     return new AlertDialog.Builder(getActivity())
                     .setTitle(getActivity().getText(R.string.app_factory_reset_dlg_title))
-                    .setIcon(android.R.drawable.ic_dialog_alert)
+                    .setIconAttribute(android.R.attr.alertDialogIcon)
                     .setMessage(getActivity().getText(R.string.app_factory_reset_dlg_text))
                     .setPositiveButton(R.string.dlg_ok,
                             new DialogInterface.OnClickListener() {
@@ -843,7 +843,7 @@
                 case DLG_APP_NOT_FOUND:
                     return new AlertDialog.Builder(getActivity())
                     .setTitle(getActivity().getText(R.string.app_not_found_dlg_title))
-                    .setIcon(android.R.drawable.ic_dialog_alert)
+                    .setIconAttribute(android.R.attr.alertDialogIcon)
                     .setMessage(getActivity().getText(R.string.app_not_found_dlg_title))
                     .setNeutralButton(getActivity().getText(R.string.dlg_ok),
                             new DialogInterface.OnClickListener() {
@@ -856,7 +856,7 @@
                 case DLG_CANNOT_CLEAR_DATA:
                     return new AlertDialog.Builder(getActivity())
                     .setTitle(getActivity().getText(R.string.clear_failed_dlg_title))
-                    .setIcon(android.R.drawable.ic_dialog_alert)
+                    .setIconAttribute(android.R.attr.alertDialogIcon)
                     .setMessage(getActivity().getText(R.string.clear_failed_dlg_text))
                     .setNeutralButton(R.string.dlg_ok,
                             new DialogInterface.OnClickListener() {
@@ -870,7 +870,7 @@
                 case DLG_FORCE_STOP:
                     return new AlertDialog.Builder(getActivity())
                     .setTitle(getActivity().getText(R.string.force_stop_dlg_title))
-                    .setIcon(android.R.drawable.ic_dialog_alert)
+                    .setIconAttribute(android.R.attr.alertDialogIcon)
                     .setMessage(getActivity().getText(R.string.force_stop_dlg_text))
                     .setPositiveButton(R.string.dlg_ok,
                         new DialogInterface.OnClickListener() {
@@ -886,14 +886,14 @@
                             getOwner().getMoveErrMsg(moveErrorCode));
                     return new AlertDialog.Builder(getActivity())
                     .setTitle(getActivity().getText(R.string.move_app_failed_dlg_title))
-                    .setIcon(android.R.drawable.ic_dialog_alert)
+                    .setIconAttribute(android.R.attr.alertDialogIcon)
                     .setMessage(msg)
                     .setNeutralButton(R.string.dlg_ok, null)
                     .create();
                 case DLG_DISABLE:
                     return new AlertDialog.Builder(getActivity())
                     .setTitle(getActivity().getText(R.string.app_disable_dlg_title))
-                    .setIcon(android.R.drawable.ic_dialog_alert)
+                    .setIconAttribute(android.R.attr.alertDialogIcon)
                     .setMessage(getActivity().getText(R.string.app_disable_dlg_text))
                     .setPositiveButton(R.string.dlg_ok,
                         new DialogInterface.OnClickListener() {
@@ -909,7 +909,7 @@
                 case DLG_DISABLE_NOTIFICATIONS:
                     return new AlertDialog.Builder(getActivity())
                     .setTitle(getActivity().getText(R.string.app_disable_notifications_dlg_title))
-                    .setIcon(android.R.drawable.ic_dialog_alert)
+                    .setIconAttribute(android.R.attr.alertDialogIcon)
                     .setMessage(getActivity().getText(R.string.app_disable_notifications_dlg_text))
                     .setPositiveButton(R.string.dlg_ok,
                         new DialogInterface.OnClickListener() {
diff --git a/src/com/android/settings/applications/RunningServiceDetails.java b/src/com/android/settings/applications/RunningServiceDetails.java
index f91abd6..2087f21 100644
--- a/src/com/android/settings/applications/RunningServiceDetails.java
+++ b/src/com/android/settings/applications/RunningServiceDetails.java
@@ -507,7 +507,7 @@
                     
                     return new AlertDialog.Builder(getActivity())
                             .setTitle(getActivity().getString(R.string.runningservicedetails_stop_dlg_title))
-                            .setIcon(android.R.drawable.ic_dialog_alert)
+                            .setIconAttribute(android.R.attr.alertDialogIcon)
                             .setMessage(getActivity().getString(R.string.runningservicedetails_stop_dlg_text))
                             .setPositiveButton(R.string.dlg_ok,
                                     new DialogInterface.OnClickListener() {
diff --git a/src/com/android/settings/bluetooth/Utils.java b/src/com/android/settings/bluetooth/Utils.java
index 01e72e0..fb44d5a 100755
--- a/src/com/android/settings/bluetooth/Utils.java
+++ b/src/com/android/settings/bluetooth/Utils.java
@@ -93,7 +93,7 @@
         Context activity = manager.getForegroundActivity();
         if(manager.isForegroundActivity()) {
             new AlertDialog.Builder(activity)
-                .setIcon(android.R.drawable.ic_dialog_alert)
+                .setIconAttribute(android.R.attr.alertDialogIcon)
                 .setTitle(R.string.bluetooth_error_title)
                 .setMessage(message)
                 .setPositiveButton(android.R.string.ok, null)
diff --git a/src/com/android/settings/deviceinfo/Memory.java b/src/com/android/settings/deviceinfo/Memory.java
index cb344bf..f1c7fbe 100644
--- a/src/com/android/settings/deviceinfo/Memory.java
+++ b/src/com/android/settings/deviceinfo/Memory.java
@@ -24,6 +24,7 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.res.Resources;
+import android.hardware.usb.UsbManager;
 import android.os.Bundle;
 import android.os.Environment;
 import android.os.IBinder;
@@ -57,14 +58,16 @@
     // The mountToggle Preference that has last been clicked.
     // Assumes no two successive unmount event on 2 different volumes are performed before the first
     // one's preference is disabled
-    private Preference mLastClickedMountToggle;
-    private String mClickedMountPoint;
+    private static Preference mLastClickedMountToggle;
+    private static String mClickedMountPoint;
 
     // Access using getMountService()
     private IMountService mMountService = null;
 
     private StorageManager mStorageManager = null;
 
+    private UsbManager mUsbManager = null;
+
     private StorageVolumePreferenceCategory mInternalStorageVolumePreferenceCategory;
     private StorageVolumePreferenceCategory[] mStorageVolumePreferenceCategories;
 
@@ -72,6 +75,8 @@
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
+        mUsbManager = (UsbManager)getSystemService(Context.USB_SERVICE);
+
         if (mStorageManager == null) {
             mStorageManager = (StorageManager) getSystemService(Context.STORAGE_SERVICE);
             mStorageManager.registerListener(mStorageListener);
@@ -119,6 +124,10 @@
         intentFilter.addDataScheme("file");
         getActivity().registerReceiver(mMediaScannerReceiver, intentFilter);
 
+        intentFilter = new IntentFilter();
+        intentFilter.addAction(UsbManager.ACTION_USB_STATE);
+        getActivity().registerReceiver(mMediaScannerReceiver, intentFilter);
+
         if (mInternalStorageVolumePreferenceCategory != null) {
             mInternalStorageVolumePreferenceCategory.onResume();
         }
@@ -237,9 +246,18 @@
     private final BroadcastReceiver mMediaScannerReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
-            // mInternalStorageVolumePreferenceCategory is not affected by the media scanner
-            for (int i = 0; i < mStorageVolumePreferenceCategories.length; i++) {
-                mStorageVolumePreferenceCategories[i].onMediaScannerFinished();
+            String action = intent.getAction();
+            if (action.equals(UsbManager.ACTION_USB_STATE)) {
+               boolean isUsbConnected = intent.getBooleanExtra(UsbManager.USB_CONNECTED, false);
+               String usbFunction = mUsbManager.getDefaultFunction();
+               for (int i = 0; i < mStorageVolumePreferenceCategories.length; i++) {
+                   mStorageVolumePreferenceCategories[i].onUsbStateChanged(isUsbConnected, usbFunction);
+               }
+            } else if (action.equals(Intent.ACTION_MEDIA_SCANNER_FINISHED)) {
+                // mInternalStorageVolumePreferenceCategory is not affected by the media scanner
+                for (int i = 0; i < mStorageVolumePreferenceCategories.length; i++) {
+                    mStorageVolumePreferenceCategories[i].onMediaScannerFinished();
+                }
             }
         }
     };
diff --git a/src/com/android/settings/deviceinfo/StorageVolumePreferenceCategory.java b/src/com/android/settings/deviceinfo/StorageVolumePreferenceCategory.java
index 0211c77..156184a 100644
--- a/src/com/android/settings/deviceinfo/StorageVolumePreferenceCategory.java
+++ b/src/com/android/settings/deviceinfo/StorageVolumePreferenceCategory.java
@@ -24,6 +24,7 @@
 import android.content.res.Resources;
 import android.graphics.drawable.ShapeDrawable;
 import android.graphics.drawable.shapes.RectShape;
+import android.hardware.usb.UsbManager;
 import android.os.Bundle;
 import android.os.Environment;
 import android.os.Handler;
@@ -69,6 +70,9 @@
 
     private boolean mAllowFormat;
 
+    private boolean mUsbConnected;
+    private String mUsbFunction;
+
     static class CategoryInfo {
         final int mTitle;
         final int mColor;
@@ -305,6 +309,23 @@
                 removePreference(mFormatPreference);
             }
         }
+
+        if (mUsbConnected && (UsbManager.USB_FUNCTION_MTP.equals(mUsbFunction) ||
+                UsbManager.USB_FUNCTION_PTP.equals(mUsbFunction))) {
+            mMountTogglePreference.setEnabled(false);
+            if (Environment.MEDIA_MOUNTED.equals(state)) {
+                mMountTogglePreference.setSummary(mResources.getString(R.string.mtp_ptp_mode_summary));
+            }
+
+            if (mFormatPreference != null) {
+                mFormatPreference.setEnabled(false);
+                mFormatPreference.setSummary(mResources.getString(R.string.mtp_ptp_mode_summary));
+            }
+        } else if (mFormatPreference != null) {
+            mFormatPreference.setEnabled(true);
+            mFormatPreference.setSummary(mResources.getString(R.string.sd_format_summary));
+        }
+
     }
 
     public void updateApproximate(long totalSize, long availSize) {
@@ -376,6 +397,11 @@
         measure();
     }
 
+    public void onUsbStateChanged(boolean isUsbConnected, String usbFunction) {
+        mUsbConnected = isUsbConnected;
+        mUsbFunction = usbFunction;
+        measure();
+    }
     public void onMediaScannerFinished() {
         measure();
     }
diff --git a/src/com/android/settings/deviceinfo/UsbSettings.java b/src/com/android/settings/deviceinfo/UsbSettings.java
index af279e8..b8290fc 100644
--- a/src/com/android/settings/deviceinfo/UsbSettings.java
+++ b/src/com/android/settings/deviceinfo/UsbSettings.java
@@ -49,9 +49,15 @@
     private UsbManager mUsbManager;
     private CheckBoxPreference mMtp;
     private CheckBoxPreference mPtp;
+    private boolean mUsbAccessoryMode;
 
     private final BroadcastReceiver mStateReceiver = new BroadcastReceiver() {
         public void onReceive(Context content, Intent intent) {
+            String action = intent.getAction();
+            if (action.equals(UsbManager.ACTION_USB_STATE)) {
+               mUsbAccessoryMode = intent.getBooleanExtra(UsbManager.USB_FUNCTION_ACCESSORY, false);
+               Log.e(TAG, "UsbAccessoryMode " + mUsbAccessoryMode);
+            }
             updateToggles(mUsbManager.getDefaultFunction());
         }
     };
@@ -106,6 +112,18 @@
             mMtp.setChecked(false);
             mPtp.setChecked(false);
         }
+
+        if (!mUsbAccessoryMode) {
+            //Enable MTP and PTP switch while USB is not in Accessory Mode, otherwise disable it
+            Log.e(TAG, "USB Normal Mode");
+            mMtp.setEnabled(true);
+            mPtp.setEnabled(true);
+        } else {
+            Log.e(TAG, "USB Accessory Mode");
+            mMtp.setEnabled(false);
+            mPtp.setEnabled(false);
+        }
+
     }
 
     @Override
diff --git a/src/com/android/settings/inputmethod/InputMethodAndSubtypeEnabler.java b/src/com/android/settings/inputmethod/InputMethodAndSubtypeEnabler.java
index ea3ddf4..13f4435 100644
--- a/src/com/android/settings/inputmethod/InputMethodAndSubtypeEnabler.java
+++ b/src/com/android/settings/inputmethod/InputMethodAndSubtypeEnabler.java
@@ -155,7 +155,7 @@
                 if (mDialog == null) {
                     mDialog = (new AlertDialog.Builder(getActivity()))
                             .setTitle(android.R.string.dialog_alert_title)
-                            .setIcon(android.R.drawable.ic_dialog_alert)
+                            .setIconAttribute(android.R.attr.alertDialogIcon)
                             .setCancelable(true)
                             .setPositiveButton(android.R.string.ok,
                                     new DialogInterface.OnClickListener() {
diff --git a/src/com/android/settings/inputmethod/InputMethodPreference.java b/src/com/android/settings/inputmethod/InputMethodPreference.java
index f555d21..103481e 100644
--- a/src/com/android/settings/inputmethod/InputMethodPreference.java
+++ b/src/com/android/settings/inputmethod/InputMethodPreference.java
@@ -253,7 +253,7 @@
         }
         mDialog = (new AlertDialog.Builder(mFragment.getActivity()))
                 .setTitle(android.R.string.dialog_alert_title)
-                .setIcon(android.R.drawable.ic_dialog_alert)
+                .setIconAttribute(android.R.attr.alertDialogIcon)
                 .setCancelable(true)
                 .setPositiveButton(android.R.string.ok,
                         new DialogInterface.OnClickListener() {
diff --git a/src/com/android/settings/inputmethod/SpellCheckersSettings.java b/src/com/android/settings/inputmethod/SpellCheckersSettings.java
index d3e5181..8b1b867 100644
--- a/src/com/android/settings/inputmethod/SpellCheckersSettings.java
+++ b/src/com/android/settings/inputmethod/SpellCheckersSettings.java
@@ -122,7 +122,7 @@
         }
         mDialog = (new AlertDialog.Builder(getActivity()))
                 .setTitle(android.R.string.dialog_alert_title)
-                .setIcon(android.R.drawable.ic_dialog_alert)
+                .setIconAttribute(android.R.attr.alertDialogIcon)
                 .setCancelable(true)
                 .setPositiveButton(android.R.string.ok,
                         new DialogInterface.OnClickListener() {
diff --git a/src/com/android/settings/quicklaunch/QuickLaunchSettings.java b/src/com/android/settings/quicklaunch/QuickLaunchSettings.java
index 47fa34a..5654323 100644
--- a/src/com/android/settings/quicklaunch/QuickLaunchSettings.java
+++ b/src/com/android/settings/quicklaunch/QuickLaunchSettings.java
@@ -144,7 +144,7 @@
                 // Create the dialog for clearing a shortcut
                 return new AlertDialog.Builder(this)
                         .setTitle(getString(R.string.quick_launch_clear_dialog_title))
-                        .setIcon(android.R.drawable.ic_dialog_alert)
+                        .setIconAttribute(android.R.attr.alertDialogIcon)
                         .setMessage(getString(R.string.quick_launch_clear_dialog_message,
                                 mClearDialogShortcut, mClearDialogBookmarkTitle))
                         .setPositiveButton(R.string.quick_launch_clear_ok_button, this)
diff --git a/src/com/android/settings/tts/TextToSpeechSettings.java b/src/com/android/settings/tts/TextToSpeechSettings.java
index fbcdb4f..603d028 100644
--- a/src/com/android/settings/tts/TextToSpeechSettings.java
+++ b/src/com/android/settings/tts/TextToSpeechSettings.java
@@ -329,7 +329,7 @@
         Log.i(TAG, "Displaying data alert for :" + key);
         AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
         builder.setTitle(android.R.string.dialog_alert_title);
-        builder.setIcon(android.R.drawable.ic_dialog_alert);
+        builder.setIconAttribute(android.R.attr.alertDialogIcon);
         builder.setMessage(getActivity().getString(
                 R.string.tts_engine_security_warning, mEnginesHelper.getEngineInfo(key).label));
         builder.setCancelable(true);
diff --git a/src/com/android/settings/wifi/p2p/WifiP2pPersistentGroup.java b/src/com/android/settings/wifi/p2p/WifiP2pPersistentGroup.java
new file mode 100644
index 0000000..d982653
--- /dev/null
+++ b/src/com/android/settings/wifi/p2p/WifiP2pPersistentGroup.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.wifi.p2p;
+
+import android.content.Context;
+import android.net.wifi.p2p.WifiP2pGroup;
+import android.preference.Preference;
+import android.view.View;
+
+public class WifiP2pPersistentGroup extends Preference {
+
+    public WifiP2pGroup mGroup;
+
+    public WifiP2pPersistentGroup(Context context, WifiP2pGroup group) {
+        super(context);
+        mGroup = group;
+    }
+
+    @Override
+    protected void onBindView(View view) {
+        setTitle(mGroup.getNetworkName());
+        super.onBindView(view);
+    }
+
+    int getNetworkId() {
+        return mGroup.getNetworkId();
+    }
+
+    String getGroupName() {
+        return mGroup.getNetworkName();
+    }
+}
diff --git a/src/com/android/settings/wifi/p2p/WifiP2pSettings.java b/src/com/android/settings/wifi/p2p/WifiP2pSettings.java
index 684ec30..1bb253a 100644
--- a/src/com/android/settings/wifi/p2p/WifiP2pSettings.java
+++ b/src/com/android/settings/wifi/p2p/WifiP2pSettings.java
@@ -30,8 +30,12 @@
 import android.net.wifi.p2p.WifiP2pConfig;
 import android.net.wifi.p2p.WifiP2pDevice;
 import android.net.wifi.p2p.WifiP2pDeviceList;
+import android.net.wifi.p2p.WifiP2pGroup;
+import android.net.wifi.p2p.WifiP2pGroupList;
 import android.net.wifi.p2p.WifiP2pManager;
+import android.net.wifi.p2p.WifiP2pManager.GroupInfoListener;
 import android.net.wifi.p2p.WifiP2pManager.PeerListListener;
+import android.net.wifi.p2p.WifiP2pManager.PersistentGroupInfoListener;
 import android.net.wifi.WpsInfo;
 import android.os.Bundle;
 import android.os.Handler;
@@ -62,7 +66,7 @@
  * Displays Wi-fi p2p settings UI
  */
 public class WifiP2pSettings extends SettingsPreferenceFragment
-        implements PeerListListener {
+        implements PeerListListener, PersistentGroupInfoListener, GroupInfoListener {
 
     private static final String TAG = "WifiP2pSettings";
     private static final boolean DBG = false;
@@ -75,19 +79,24 @@
     private OnClickListener mRenameListener;
     private OnClickListener mDisconnectListener;
     private OnClickListener mCancelConnectListener;
+    private OnClickListener mDeleteGroupListener;
     private WifiP2pPeer mSelectedWifiPeer;
+    private WifiP2pPersistentGroup mSelectedGroup;
     private EditText mDeviceNameText;
 
     private boolean mWifiP2pEnabled;
     private boolean mWifiP2pSearching;
     private int mConnectedDevices;
+    private WifiP2pGroup mConnectedGroup;
 
     private PreferenceGroup mPeersGroup;
+    private PreferenceGroup mPersistentGroup;
     private Preference mThisDevicePref;
 
     private static final int DIALOG_DISCONNECT  = 1;
     private static final int DIALOG_CANCEL_CONNECT = 2;
     private static final int DIALOG_RENAME = 3;
+    private static final int DIALOG_DELETE_GROUP = 4;
 
     private static final String SAVE_DIALOG_PEER = "PEER_STATE";
     private static final String SAVE_DEVICE_NAME = "DEV_NAME";
@@ -114,6 +123,9 @@
                 if (mWifiP2pManager == null) return;
                 NetworkInfo networkInfo = (NetworkInfo) intent.getParcelableExtra(
                         WifiP2pManager.EXTRA_NETWORK_INFO);
+                if (mWifiP2pManager != null) {
+                    mWifiP2pManager.requestGroupInfo(mChannel, WifiP2pSettings.this);
+                }
                 if (networkInfo.isConnected()) {
                     if (DBG) Log.d(TAG, "Connected");
                 } else {
@@ -134,6 +146,10 @@
                 } else {
                     updateSearchMenu(false);
                 }
+            } else if (WifiP2pManager.WIFI_P2P_PERSISTENT_GROUPS_CHANGED_ACTION.equals(action)) {
+                if (mWifiP2pManager != null) {
+                    mWifiP2pManager.requestPersistentGroupInfo(mChannel, WifiP2pSettings.this);
+                }
             }
         }
     };
@@ -147,6 +163,7 @@
         mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
         mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);
         mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_DISCOVERY_CHANGED_ACTION);
+        mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_PERSISTENT_GROUPS_CHANGED_ACTION);
 
         final Activity activity = getActivity();
         mWifiP2pManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
@@ -230,6 +247,27 @@
             }
         };
 
+        //delete persistent group dialog listener
+        mDeleteGroupListener = new OnClickListener() {
+            @Override
+            public void onClick(DialogInterface dialog, int which) {
+                if (which == DialogInterface.BUTTON_POSITIVE) {
+                    if (mWifiP2pManager != null) {
+                        mWifiP2pManager.deletePersistentGroup(mChannel,
+                                mSelectedGroup.getNetworkId(),
+                                new WifiP2pManager.ActionListener() {
+                            public void onSuccess() {
+                                if (DBG) Log.d(TAG, " delete group success");
+                            }
+                            public void onFailure(int reason) {
+                                if (DBG) Log.d(TAG, " delete group fail " + reason);
+                            }
+                        });
+                    }
+                }
+            }
+        };
+
         setHasOptionsMenu(true);
 
         final PreferenceScreen preferenceScreen = getPreferenceScreen();
@@ -242,6 +280,9 @@
         mPeersGroup = new PreferenceCategory(getActivity());
         mPeersGroup.setTitle(R.string.wifi_p2p_peer_devices);
 
+        mPersistentGroup = new PreferenceCategory(getActivity());
+        mPersistentGroup.setTitle(R.string.wifi_p2p_remembered_groups);
+
         super.onActivityCreated(savedInstanceState);
     }
 
@@ -342,6 +383,9 @@
                             }
                     });
             }
+        } else if (preference instanceof WifiP2pPersistentGroup) {
+            mSelectedGroup = (WifiP2pPersistentGroup) preference;
+            showDialog(DIALOG_DELETE_GROUP);
         }
         return super.onPreferenceTreeClick(screen, preference);
     }
@@ -396,6 +440,16 @@
                 .setNegativeButton(getActivity().getString(R.string.dlg_cancel), null)
                 .create();
             return dialog;
+        } else if (id == DIALOG_DELETE_GROUP) {
+            int stringId = R.string.wifi_p2p_delete_group_message;
+
+            AlertDialog dialog = new AlertDialog.Builder(getActivity())
+                .setTitle(R.string.wifi_p2p_delete_group_title)
+                .setMessage(getActivity().getString(stringId, mSelectedGroup.getGroupName()))
+                .setPositiveButton(getActivity().getString(R.string.dlg_ok), mDeleteGroupListener)
+                .setNegativeButton(getActivity().getString(R.string.dlg_cancel), null)
+                .create();
+            return dialog;
         }
         return null;
     }
@@ -423,6 +477,21 @@
         if (DBG) Log.d(TAG, " mConnectedDevices " + mConnectedDevices);
     }
 
+    public void onPersistentGroupInfoAvailable(WifiP2pGroupList groups) {
+        mPersistentGroup.removeAll();
+
+        for (WifiP2pGroup group: groups.getGroupList()) {
+            if (DBG) Log.d(TAG, " group " + group);
+            mPersistentGroup.addPreference(new WifiP2pPersistentGroup(getActivity(), group));
+        }
+    }
+
+    public void onGroupInfoAvailable(WifiP2pGroup group) {
+        if (DBG) Log.d(TAG, " group " + group);
+        mConnectedGroup = group;
+        updateDevicePref();
+    }
+
     private void handleP2pStateChanged() {
         updateSearchMenu(false);
         if (mWifiP2pEnabled) {
@@ -435,6 +504,9 @@
             mPeersGroup.setEnabled(true);
             preferenceScreen.addPreference(mPeersGroup);
 
+            mPersistentGroup.setEnabled(true);
+            preferenceScreen.addPreference(mPersistentGroup);
+
             /* Request latest set of peers */
             mWifiP2pManager.requestPeers(mChannel, WifiP2pSettings.this);
         }