Merge "Listen to INetworkPolicyManager events and update UI accordingly." into nyc-dev
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 6637d7e..f6c7957 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1885,7 +1885,8 @@
                 android:label="@string/development_settings_title"
                 android:icon="@drawable/ic_settings_development"
                 android:taskAffinity="com.android.settings"
-                android:parentActivityName="Settings">
+                android:parentActivityName="Settings"
+                android:enabled="false">
             <intent-filter android:priority="1">
                 <action android:name="android.settings.APPLICATION_DEVELOPMENT_SETTINGS" />
                 <action android:name="com.android.settings.APPLICATION_DEVELOPMENT_SETTINGS" />
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 53c97b5..616fe39 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -1096,8 +1096,7 @@
             enabled = false;
         }
         int state = pm.getComponentEnabledSetting(component);
-        boolean isEnabled = state == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT
-                || state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
+        boolean isEnabled = state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
         if (isEnabled != enabled) {
             pm.setComponentEnabledSetting(component, enabled
                     ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
diff --git a/src/com/android/settings/dashboard/SummaryLoader.java b/src/com/android/settings/dashboard/SummaryLoader.java
index 55d97df..780d68e 100644
--- a/src/com/android/settings/dashboard/SummaryLoader.java
+++ b/src/com/android/settings/dashboard/SummaryLoader.java
@@ -16,8 +16,14 @@
 package com.android.settings.dashboard;
 
 import android.app.Activity;
+import android.content.BroadcastReceiver;
 import android.content.ComponentName;
-import android.os.*;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
+import android.os.Message;
 import android.os.Process;
 import android.util.ArrayMap;
 import android.util.Log;
@@ -45,6 +51,7 @@
 
     private DashboardAdapter mAdapter;
     private boolean mListening;
+    private ArrayList<BroadcastReceiver> mReceivers = new ArrayList<>();
 
     public SummaryLoader(Activity activity, List<DashboardCategory> categories) {
         mHandler = new Handler();
@@ -88,6 +95,14 @@
     }
 
     public void setListening(boolean listening) {
+        synchronized (mReceivers) {
+            // Unregister listeners immediately.
+            mListening = false;
+            for (int i = 0; i < mReceivers.size(); i++) {
+                mActivity.unregisterReceiver(mReceivers.get(i));
+            }
+            mReceivers.clear();
+        }
         mWorker.obtainMessage(Worker.MSG_SET_LISTENING, listening ? 1 : 0, 0).sendToTarget();
     }
 
@@ -128,13 +143,28 @@
         return tile.metaData;
     }
 
+    /**
+     * Registers a receiver and automatically unregisters it when the activity is stopping.
+     * This ensures that the receivers are unregistered immediately, since most summary loader
+     * operations are asynchronous.
+     */
+    public void registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
+        synchronized (mReceivers) {
+            if (!mListening) {
+                return;
+            }
+            mReceivers.add(receiver);
+            mActivity.registerReceiver(receiver, filter);
+        }
+    }
+
     private synchronized void setListeningW(boolean listening) {
         if (mListening == listening) return;
         if (DEBUG) Log.d(TAG, "Listening " + listening);
+        mListening = listening;
         for (SummaryProvider p : mSummaryMap.keySet()) {
             p.setListening(listening);
         }
-        mListening = listening;
     }
 
     private synchronized void makeProviderW(Tile tile) {
diff --git a/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java b/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
index 5f5975d..66026eb 100644
--- a/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
+++ b/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
@@ -326,6 +326,12 @@
     }
 
     @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        mDetached = false;
+    }
+
+    @Override
     public void onDetach() {
         super.onDetach();
         mDetached = true;
diff --git a/src/com/android/settings/deviceinfo/SimStatus.java b/src/com/android/settings/deviceinfo/SimStatus.java
index 80dfc58..0acad37 100644
--- a/src/com/android/settings/deviceinfo/SimStatus.java
+++ b/src/com/android/settings/deviceinfo/SimStatus.java
@@ -151,7 +151,7 @@
             mSir = mSelectableSubInfos.size() > 0 ? mSelectableSubInfos.get(0) : null;
 
             if (mSelectableSubInfos.size() > 1) {
-                setContentView(com.android.internal.R.layout.common_tab_settings);
+                setContentView(R.layout.icc_lock_tabs);
 
                 mTabHost = (TabHost) findViewById(android.R.id.tabhost);
                 mTabWidget = (TabWidget) findViewById(android.R.id.tabs);
diff --git a/src/com/android/settings/deviceinfo/StorageSettings.java b/src/com/android/settings/deviceinfo/StorageSettings.java
index 9774db9..902ca07 100644
--- a/src/com/android/settings/deviceinfo/StorageSettings.java
+++ b/src/com/android/settings/deviceinfo/StorageSettings.java
@@ -248,6 +248,10 @@
             // Picked a normal volume
             final VolumeInfo vol = mStorageManager.findVolumeById(key);
 
+            if (vol == null) {
+                return false;
+            }
+
             if (vol.getState() == VolumeInfo.STATE_UNMOUNTED) {
                 VolumeUnmountedFragment.show(this, vol.getId());
                 return true;
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 08e27ec..8eb1759 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -28,7 +28,6 @@
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.res.Resources;
-import android.graphics.drawable.Drawable;
 import android.net.ConnectivityManager;
 import android.net.NetworkInfo;
 import android.net.NetworkInfo.State;
@@ -39,15 +38,12 @@
 import android.os.Bundle;
 import android.os.HandlerThread;
 import android.os.Process;
-import android.os.RemoteException;
-import android.os.UserHandle;
 import android.provider.Settings;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceViewHolder;
 import android.text.Spannable;
 import android.text.style.TextAppearanceSpan;
 import android.util.Log;
-import android.util.TypedValue;
 import android.view.ContextMenu;
 import android.view.ContextMenu.ContextMenuInfo;
 import android.view.Menu;
@@ -58,7 +54,6 @@
 import android.widget.TextView;
 import android.widget.TextView.BufferType;
 import android.widget.Toast;
-
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.MetricsProto.MetricsEvent;
 import com.android.settings.LinkifyUtils;
@@ -999,9 +994,7 @@
                 filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
                 filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
                 filter.addAction(WifiManager.RSSI_CHANGED_ACTION);
-                mContext.registerReceiver(this, filter);
-            } else {
-                mContext.unregisterReceiver(this);
+                mSummaryLoader.registerReceiver(this, filter);
             }
         }