Merge "Updates/fixes to memory settings" into mnc-dev
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index dc01c24..12551d0 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1852,7 +1852,6 @@
                 android:label="@string/wifi_display_settings_title"
                 android:taskAffinity="">
             <intent-filter android:priority="1">
-                <action android:name="android.settings.WIFI_DISPLAY_SETTINGS" />
                 <action android:name="android.settings.CAST_SETTINGS" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
@@ -2326,6 +2325,8 @@
                 android:value="com.android.settings.notification.OtherSoundSettings" />
             <meta-data android:name="com.android.settings.TOP_LEVEL_HEADER_ID"
                 android:resource="@id/notification_settings" />
+            <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
+                android:value="true" />
         </activity>
 
         <!-- Show apps for which application-level notification settings are applicable -->
diff --git a/res/layout/battery_history_chart.xml b/res/layout/battery_history_chart.xml
index 0e3cf88..c0c37f1 100644
--- a/res/layout/battery_history_chart.xml
+++ b/res/layout/battery_history_chart.xml
@@ -28,7 +28,7 @@
         android:gravity="center_vertical"
         android:id="@+id/battery_history_chart"
         android:textAppearance="?android:attr/textAppearanceSmall"
-        android:textColor="#ff000000"
+        android:textColor="?android:attr/textColorPrimary"
         app:headerAppearance="?android:attr/textAppearanceMedium"
         android:shadowRadius="4"
         android:shadowColor="?android:attr/colorBackground"
diff --git a/res/layout/data_usage_summary.xml b/res/layout/data_usage_summary.xml
index 6634105..8875004 100644
--- a/res/layout/data_usage_summary.xml
+++ b/res/layout/data_usage_summary.xml
@@ -26,6 +26,11 @@
         android:orientation="vertical"
         android:background="@drawable/default_preference_background">
 
+        <FrameLayout
+            android:id="@+id/pinned_header"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" />
+
         <include layout="@layout/tab_widget" />
 
         <!-- give an empty content area to make tabhost happy -->
diff --git a/res/layout/manage_applications_apps.xml b/res/layout/manage_applications_apps.xml
index 044cdb4..e4ec871 100644
--- a/res/layout/manage_applications_apps.xml
+++ b/res/layout/manage_applications_apps.xml
@@ -30,6 +30,11 @@
                 android:orientation="vertical"
                 android:visibility="gone">
 
+            <FrameLayout
+                android:id="@+id/pinned_header"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content" />
+
             <FrameLayout android:layout_width="match_parent"
                     android:layout_height="0px"
                     android:layout_weight="1">
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 672d4e7..7467248 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -5966,6 +5966,9 @@
     <!-- Sound & notification > Other sounds: Title for the option enabling touch sounds for screen locking sounds. [CHAR LIMIT=30] -->
     <string name="screen_locking_sounds_title">Screen locking sounds</string>
 
+    <!-- Sound & notification > Other sounds: Title for the option enabling charging sounds. [CHAR LIMIT=30] -->
+    <string name="charging_sounds_title">Charging sounds</string>
+
     <!-- Sound & notification > Other sounds: Title for the option enabling docking sounds. [CHAR LIMIT=30] -->
     <string name="docking_sounds_title">Docking sounds</string>
 
diff --git a/res/xml/other_sound_settings.xml b/res/xml/other_sound_settings.xml
index 88c4130..57a302b 100644
--- a/res/xml/other_sound_settings.xml
+++ b/res/xml/other_sound_settings.xml
@@ -35,6 +35,14 @@
             android:switchTextOn=""
             android:persistent="false" />
 
+    <!-- Charging sounds -->
+    <SwitchPreference
+            android:key="charging_sounds"
+            android:title="@string/charging_sounds_title"
+            android:switchTextOff=""
+            android:switchTextOn=""
+            android:persistent="false" />
+
     <!-- Docking sounds -->
     <SwitchPreference
             android:key="docking_sounds"
diff --git a/src/com/android/settings/AppHeader.java b/src/com/android/settings/AppHeader.java
index 2f3678b..71c2255 100644
--- a/src/com/android/settings/AppHeader.java
+++ b/src/com/android/settings/AppHeader.java
@@ -28,18 +28,27 @@
 
 public class AppHeader {
 
-    public static void createAppHeader(final Activity activity, Drawable icon, CharSequence label,
-            final Intent settingsIntent) {
-        createAppHeader(activity, icon, label, settingsIntent, 0);
+    public static void createAppHeader(SettingsPreferenceFragment fragment, Drawable icon,
+            CharSequence label, final Intent settingsIntent) {
+        createAppHeader(fragment, icon, label, settingsIntent, 0);
     }
 
-    public static void createAppHeader(final Activity activity, Drawable icon, CharSequence label,
-            final Intent settingsIntent, int tintColorRes) {
-        final View content = activity.findViewById(R.id.main_content);
-        final ViewGroup contentParent = (ViewGroup) content.getParent();
+    public static void createAppHeader(Activity activity, Drawable icon, CharSequence label,
+            final Intent settingsIntent, ViewGroup pinnedHeader) {
         final View bar = activity.getLayoutInflater().inflate(R.layout.app_header,
-                contentParent, false);
+                pinnedHeader, false);
+        setupHeaderView(activity, icon, label, settingsIntent, 0, bar);
+        pinnedHeader.addView(bar);
+    }
 
+    public static void createAppHeader(SettingsPreferenceFragment fragment, Drawable icon,
+            CharSequence label, Intent settingsIntent, int tintColorRes) {
+        View bar = fragment.setPinnedHeaderView(R.layout.app_header);
+        setupHeaderView(fragment.getActivity(), icon, label, settingsIntent, tintColorRes, bar);
+    }
+
+    private static View setupHeaderView(final Activity activity, Drawable icon, CharSequence label,
+            final Intent settingsIntent, int tintColorRes, View bar) {
         final ImageView appIcon = (ImageView) bar.findViewById(R.id.app_icon);
         appIcon.setImageDrawable(icon);
         if (tintColorRes != 0) {
@@ -61,7 +70,8 @@
                 }
             });
         }
-        contentParent.addView(bar, 0);
+
+        return bar;
     }
 
 }
diff --git a/src/com/android/settings/DataUsageSummary.java b/src/com/android/settings/DataUsageSummary.java
index 27a486c..7eec3df 100644
--- a/src/com/android/settings/DataUsageSummary.java
+++ b/src/com/android/settings/DataUsageSummary.java
@@ -112,6 +112,7 @@
 import android.widget.ArrayAdapter;
 import android.widget.BaseAdapter;
 import android.widget.Button;
+import android.widget.FrameLayout;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.ListView;
@@ -120,12 +121,12 @@
 import android.widget.Spinner;
 import android.widget.Switch;
 import android.widget.TabHost;
-import android.widget.Toast;
 import android.widget.TabHost.OnTabChangeListener;
 import android.widget.TabHost.TabContentFactory;
 import android.widget.TabHost.TabSpec;
 import android.widget.TabWidget;
 import android.widget.TextView;
+import android.widget.Toast;
 
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.telephony.PhoneConstants;
@@ -464,12 +465,12 @@
         mListView.setOnItemClickListener(mListListener);
         mListView.setAdapter(mAdapter);
 
-        showRequestedAppIfNeeded();
+        showRequestedAppIfNeeded(view);
 
         return view;
     }
 
-    private void showRequestedAppIfNeeded() {
+    private void showRequestedAppIfNeeded(View rootView) {
         if (mShowAppImmediatePkg == null) {
             return;
         }
@@ -482,7 +483,8 @@
             final UidDetail detail = mUidDetailProvider.getUidDetail(app.key, true);
             // When we are going straight to an app then we are coming from App Info and want
             // a header at the top.
-            AppHeader.createAppHeader(getActivity(), detail.icon, detail.label, null);
+            FrameLayout pinnedHeader = (FrameLayout) rootView.findViewById(R.id.pinned_header);
+            AppHeader.createAppHeader(getActivity(), detail.icon, detail.label, null, pinnedHeader);
             AppDetailsFragment.show(DataUsageSummary.this, app, detail.label, false);
         } catch (NameNotFoundException e) {
             Log.w(TAG, "Could not find " + mShowAppImmediatePkg, e);
diff --git a/src/com/android/settings/applications/AppInfoBase.java b/src/com/android/settings/applications/AppInfoBase.java
index 2d402e5..e42f246 100644
--- a/src/com/android/settings/applications/AppInfoBase.java
+++ b/src/com/android/settings/applications/AppInfoBase.java
@@ -37,12 +37,13 @@
 
 import com.android.settings.InstrumentedPreferenceFragment;
 import com.android.settings.SettingsActivity;
+import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.Utils;
 import com.android.settings.applications.ApplicationsState.AppEntry;
 
 import java.util.ArrayList;
 
-public abstract class AppInfoBase extends InstrumentedPreferenceFragment
+public abstract class AppInfoBase extends SettingsPreferenceFragment
         implements ApplicationsState.Callbacks {
 
     public static final String ARG_PACKAGE_NAME = "package";
diff --git a/src/com/android/settings/applications/AppInfoWithHeader.java b/src/com/android/settings/applications/AppInfoWithHeader.java
index f7546f2..f8feaf1 100644
--- a/src/com/android/settings/applications/AppInfoWithHeader.java
+++ b/src/com/android/settings/applications/AppInfoWithHeader.java
@@ -34,7 +34,7 @@
         }
         mCreated = true;
         if (mPackageInfo == null) return;
-        AppHeader.createAppHeader(getActivity(), mPackageInfo.applicationInfo.loadIcon(mPm),
-                mPackageInfo.applicationInfo.loadLabel(mPm), null);
+        AppHeader.createAppHeader(this, mPackageInfo.applicationInfo.loadIcon(mPm),
+                mPackageInfo.applicationInfo.loadLabel(mPm), null, 0);
     }
 }
diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java
index b55cc44..aaec5cf 100644
--- a/src/com/android/settings/applications/ManageApplications.java
+++ b/src/com/android/settings/applications/ManageApplications.java
@@ -45,6 +45,7 @@
 import android.widget.BaseAdapter;
 import android.widget.Filter;
 import android.widget.Filterable;
+import android.widget.FrameLayout;
 import android.widget.ListView;
 import android.widget.Spinner;
 
@@ -232,8 +233,8 @@
             } else {
                 // No volume selected, display a normal list, sorted by size.
                 mListType = LIST_TYPE_MAIN;
-                mSortOrder = R.id.sort_order_size;
             }
+            mSortOrder = R.id.sort_order_size;
         } else if (className.equals(UsageAccessSettingsActivity.class.getName())) {
             mListType = LIST_TYPE_USAGE_ACCESS;
             getActivity().getActionBar().setTitle(R.string.usage_access_title);
@@ -298,15 +299,14 @@
 
     private void createHeader() {
         Activity activity = getActivity();
-        View content = activity.findViewById(R.id.main_content);
-        ViewGroup contentParent = (ViewGroup) content.getParent();
+        FrameLayout pinnedHeader = (FrameLayout) mRootView.findViewById(R.id.pinned_header);
         mSpinnerHeader = (ViewGroup) activity.getLayoutInflater()
-                .inflate(R.layout.apps_filter_spinner, contentParent, false);
+                .inflate(R.layout.apps_filter_spinner, pinnedHeader, false);
         mFilterSpinner = (Spinner) mSpinnerHeader.findViewById(R.id.filter_spinner);
         mFilterAdapter = new FilterSpinnerAdapter(this);
         mFilterSpinner.setAdapter(mFilterAdapter);
         mFilterSpinner.setOnItemSelectedListener(this);
-        contentParent.addView(mSpinnerHeader, 0);
+        pinnedHeader.addView(mSpinnerHeader, 0);
 
         mFilterAdapter.enableFilter(getDefaultFilter());
         if (mListType == LIST_TYPE_MAIN || mListType == LIST_TYPE_NOTIFICATION) {
@@ -333,7 +333,8 @@
     public void onViewCreated(View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
         if (mListType == LIST_TYPE_STORAGE) {
-            AppHeader.createAppHeader(getActivity(), null, mVolumeName, null);
+            FrameLayout pinnedHeader = (FrameLayout) mRootView.findViewById(R.id.pinned_header);
+            AppHeader.createAppHeader(getActivity(), null, mVolumeName, null, pinnedHeader);
         }
     }
 
diff --git a/src/com/android/settings/applications/ProcessStatsDetail.java b/src/com/android/settings/applications/ProcessStatsDetail.java
index 317e3b2..7035bf0 100644
--- a/src/com/android/settings/applications/ProcessStatsDetail.java
+++ b/src/com/android/settings/applications/ProcessStatsDetail.java
@@ -113,7 +113,7 @@
     public void onViewCreated(View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
 
-        AppHeader.createAppHeader(getActivity(),
+        AppHeader.createAppHeader(this,
                 mApp.mUiTargetApp != null ? mApp.mUiTargetApp.loadIcon(mPm) : new ColorDrawable(0),
                 mApp.mUiLabel, null);
     }
diff --git a/src/com/android/settings/deviceinfo/SimStatus.java b/src/com/android/settings/deviceinfo/SimStatus.java
index 4fa5673..ea4c3e1 100644
--- a/src/com/android/settings/deviceinfo/SimStatus.java
+++ b/src/com/android/settings/deviceinfo/SimStatus.java
@@ -143,24 +143,28 @@
         // Note - missing in zaku build, be careful later...
         mSignalStrength = findPreference(KEY_SIGNAL_STRENGTH);
 
-        mSir = mSelectableSubInfos.size() > 0 ? mSelectableSubInfos.get(0) : null;
-        if (mSelectableSubInfos.size() > 1) {
-            setContentView(R.layout.sim_information);
+        if (mSelectableSubInfos == null) {
+            mSir = null;
+        } else {
+            mSir = mSelectableSubInfos.size() > 0 ? mSelectableSubInfos.get(0) : null;
 
-            mTabHost = (TabHost) findViewById(android.R.id.tabhost);
-            mTabWidget = (TabWidget) findViewById(android.R.id.tabs);
-            mListView = (ListView) findViewById(android.R.id.list);
+            if (mSelectableSubInfos.size() > 1) {
+                setContentView(R.layout.sim_information);
 
-            mTabHost.setup();
-            mTabHost.setOnTabChangedListener(mTabListener);
-            mTabHost.clearAllTabs();
+                mTabHost = (TabHost) findViewById(android.R.id.tabhost);
+                mTabWidget = (TabWidget) findViewById(android.R.id.tabs);
+                mListView = (ListView) findViewById(android.R.id.list);
 
-            for (int i = 0; i < mSelectableSubInfos.size(); i++) {
-                mTabHost.addTab(buildTabSpec(String.valueOf(i),
-                        String.valueOf(mSelectableSubInfos.get(i).getDisplayName())));
+                mTabHost.setup();
+                mTabHost.setOnTabChangedListener(mTabListener);
+                mTabHost.clearAllTabs();
+
+                for (int i = 0; i < mSelectableSubInfos.size(); i++) {
+                    mTabHost.addTab(buildTabSpec(String.valueOf(i),
+                            String.valueOf(mSelectableSubInfos.get(i).getDisplayName())));
+                }
             }
         }
-
         updatePhoneInfos();
     }
 
diff --git a/src/com/android/settings/fuelgauge/PowerUsageDetail.java b/src/com/android/settings/fuelgauge/PowerUsageDetail.java
index 4aa935a..bac8202 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageDetail.java
@@ -464,7 +464,7 @@
             appIcon = getActivity().getPackageManager().getDefaultActivityIcon();
         }
 
-        AppHeader.createAppHeader(getActivity(), appIcon, title, null,
+        AppHeader.createAppHeader(this, appIcon, title, null,
                 mDrainType != DrainType.APP ? android.R.color.white : 0);
     }
 
diff --git a/src/com/android/settings/notification/AppNotificationSettings.java b/src/com/android/settings/notification/AppNotificationSettings.java
index 883975a..28245c8 100644
--- a/src/com/android/settings/notification/AppNotificationSettings.java
+++ b/src/com/android/settings/notification/AppNotificationSettings.java
@@ -84,7 +84,7 @@
         }
         mCreated = true;
         if (mAppRow == null) return;
-        AppHeader.createAppHeader(getActivity(), mAppRow.icon, mAppRow.label,
+        AppHeader.createAppHeader(this, mAppRow.icon, mAppRow.label,
                 mAppRow.settingsIntent);
     }
 
diff --git a/src/com/android/settings/notification/OtherSoundSettings.java b/src/com/android/settings/notification/OtherSoundSettings.java
index c226906..969ec90 100644
--- a/src/com/android/settings/notification/OtherSoundSettings.java
+++ b/src/com/android/settings/notification/OtherSoundSettings.java
@@ -60,6 +60,7 @@
 
     private static final String KEY_DIAL_PAD_TONES = "dial_pad_tones";
     private static final String KEY_SCREEN_LOCKING_SOUNDS = "screen_locking_sounds";
+    private static final String KEY_CHARGING_SOUNDS = "charging_sounds";
     private static final String KEY_DOCKING_SOUNDS = "docking_sounds";
     private static final String KEY_TOUCH_SOUNDS = "touch_sounds";
     private static final String KEY_VIBRATE_ON_TOUCH = "vibrate_on_touch";
@@ -77,6 +78,9 @@
     private static final SettingPref PREF_SCREEN_LOCKING_SOUNDS = new SettingPref(
             TYPE_SYSTEM, KEY_SCREEN_LOCKING_SOUNDS, System.LOCKSCREEN_SOUNDS_ENABLED, DEFAULT_ON);
 
+    private static final SettingPref PREF_CHARGING_SOUNDS = new SettingPref(
+            TYPE_GLOBAL, KEY_CHARGING_SOUNDS, Global.CHARGING_SOUNDS_ENABLED, DEFAULT_ON);
+
     private static final SettingPref PREF_DOCKING_SOUNDS = new SettingPref(
             TYPE_GLOBAL, KEY_DOCKING_SOUNDS, Global.DOCK_SOUNDS_ENABLED, DEFAULT_ON) {
         @Override
@@ -155,6 +159,7 @@
     private static final SettingPref[] PREFS = {
         PREF_DIAL_PAD_TONES,
         PREF_SCREEN_LOCKING_SOUNDS,
+        PREF_CHARGING_SOUNDS,
         PREF_DOCKING_SOUNDS,
         PREF_TOUCH_SOUNDS,
         PREF_VIBRATE_ON_TOUCH,
diff --git a/src/com/android/settings/wifi/AccessPointPreference.java b/src/com/android/settings/wifi/AccessPointPreference.java
index 0f702b2..511d88d 100644
--- a/src/com/android/settings/wifi/AccessPointPreference.java
+++ b/src/com/android/settings/wifi/AccessPointPreference.java
@@ -21,7 +21,6 @@
 import android.preference.Preference;
 import android.view.View;
 import android.widget.TextView;
-
 import com.android.settings.R;
 import com.android.settingslib.wifi.AccessPoint;
 
@@ -81,7 +80,11 @@
                             ? STATE_SECURED
                             : STATE_NONE);
                     drawable = sld.getCurrent();
-                    setIcon(drawable);
+                    if (!mForSavedNetworks) {
+                        setIcon(drawable);
+                    } else {
+                        setIcon(null);
+                    }
                 }
             }
 
diff --git a/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java b/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java
index 04d2107..1444ad5 100644
--- a/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java
+++ b/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java
@@ -41,6 +41,8 @@
 import com.android.settings.search.SearchIndexableRaw;
 import com.android.settingslib.wifi.AccessPoint;
 import com.android.settingslib.wifi.WifiTracker;
+import java.util.Collections;
+import java.util.Comparator;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -97,35 +99,22 @@
 
         final List<AccessPoint> accessPoints = WifiTracker.getCurrentAccessPoints(context, true,
                 false, true);
-
+        Collections.sort(accessPoints, new Comparator<AccessPoint>() {
+            public int compare(AccessPoint ap1, AccessPoint ap2) {
+                if (ap1.getConfigName() != null) {
+                    return ap1.getConfigName().compareTo(ap2.getConfigName());
+                } else {
+                    return -1;
+                }
+            }
+        });
         preferenceScreen.removeAll();
 
-        PackageManager pm = context.getPackageManager();
-        String systemName = pm.getNameForUid(android.os.Process.SYSTEM_UID);
-
         final int accessPointsSize = accessPoints.size();
         for (int i = 0; i < accessPointsSize; ++i){
             AccessPointPreference preference = new AccessPointPreference(accessPoints.get(i),
                     context, true);
-            WifiConfiguration config = accessPoints.get(i).getConfig();
-            if (config != null) {
-                int userId = UserHandle.getUserId(config.creatorUid);
-                ApplicationInfo appInfo = null;
-                if (config.creatorName != null && config.creatorName.equals(systemName)) {
-                    appInfo = context.getApplicationInfo();
-                } else {
-                    try {
-                        IPackageManager ipm = AppGlobals.getPackageManager();
-                        appInfo = ipm.getApplicationInfo(config.creatorName, 0 /* flags */, userId);
-                    } catch (RemoteException rex) {
-                    }
-                }
-                if (appInfo != null) {
-                    preference.setSummary(getResources().getString(appInfo.labelRes));
-                }
-            } else {
-                preference.setShowSummary(false);
-            }
+            preference.setIcon(null);
             preferenceScreen.addPreference(preference);
         }