Fix problem with calling onConfigurationChanged() too much.

We now return the initial configuration for a window when it is
added to the window manager.  The view hierarchy would check to
see if it was different than the last one, and not dispatch a
configuration change down itself if not.  However, when
ActivityThread received it, it would always dispatch a config
change even if it is the same.

The solution is to only do this in ActivityThread if the config
is actually different; otherwise, we continue to rely only on
the activity manager explicitly telling us when to do a config
change.

Change-Id: I8a6e3565776dd2723c8b791496bb6041463d4b67
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 1c980e3..fa6abec 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -3908,16 +3908,16 @@
         }
     }
 
-    final void applyConfigurationToResourcesLocked(Configuration config) {
+    final boolean applyConfigurationToResourcesLocked(Configuration config) {
         if (mResConfiguration == null) {
             mResConfiguration = new Configuration();
         }
         if (!mResConfiguration.isOtherSeqNewer(config)) {
             if (DEBUG_CONFIGURATION) Log.v(TAG, "Skipping new config: curSeq="
                     + mResConfiguration.seq + ", newSeq=" + config.seq);
-            return;
+            return false;
         }
-        mResConfiguration.updateFrom(config);
+        int changes = mResConfiguration.updateFrom(config);
         DisplayMetrics dm = getDisplayMetricsLocked(true);
 
         // set it for java, this also affects newly created Resources
@@ -3948,6 +3948,8 @@
                 it.remove();
             }
         }
+        
+        return changes != 0;
     }
     
     final void handleConfigurationChanged(Configuration config) {
@@ -4522,17 +4524,20 @@
         ViewRoot.addConfigCallback(new ComponentCallbacks() {
             public void onConfigurationChanged(Configuration newConfig) {
                 synchronized (mPackages) {
-                    if (mPendingConfiguration == null ||
-                            mPendingConfiguration.isOtherSeqNewer(newConfig)) {
-                        mPendingConfiguration = newConfig;
-                        
-                        // We need to apply this change to the resources
-                        // immediately, because upon returning the view
-                        // hierarchy will be informed about it.
-                        applyConfigurationToResourcesLocked(newConfig);
+                    // We need to apply this change to the resources
+                    // immediately, because upon returning the view
+                    // hierarchy will be informed about it.
+                    if (applyConfigurationToResourcesLocked(newConfig)) {
+                        // This actually changed the resources!  Tell
+                        // everyone about it.
+                        if (mPendingConfiguration == null ||
+                                mPendingConfiguration.isOtherSeqNewer(newConfig)) {
+                            mPendingConfiguration = newConfig;
+                            
+                            queueOrSendMessage(H.CONFIGURATION_CHANGED, newConfig);
+                        }
                     }
                 }
-                queueOrSendMessage(H.CONFIGURATION_CHANGED, newConfig);
             }
             public void onLowMemory() {
             }