am 474731d5: Merge change I2ffe306f into eclair

Merge commit '474731d5efb30c1e9184f998610054747eb8e764' into eclair-mr2

* commit '474731d5efb30c1e9184f998610054747eb8e764':
  Fix issue #2304284: contacts/dialer/recentcalls constantly flashing
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 1115f92..909620d 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -1383,13 +1383,14 @@
 
         public final void scheduleRelaunchActivity(IBinder token,
                 List<ResultInfo> pendingResults, List<Intent> pendingNewIntents,
-                int configChanges, boolean notResumed) {
+                int configChanges, boolean notResumed, Configuration config) {
             ActivityRecord r = new ActivityRecord();
 
             r.token = token;
             r.pendingResults = pendingResults;
             r.pendingIntents = pendingNewIntents;
             r.startsNotResumed = notResumed;
+            r.createdConfig = config;
 
             synchronized (mRelaunchingActivities) {
                 mRelaunchingActivities.add(r);
@@ -2511,7 +2512,7 @@
         Activity a = performLaunchActivity(r, customIntent);
 
         if (a != null) {
-            r.createdConfig = new Configuration(a.getResources().getConfiguration());
+            r.createdConfig = new Configuration(mConfiguration);
             handleResumeActivity(r.token, false, r.isForward);
 
             if (!r.activity.mFinished && r.startsNotResumed) {
@@ -3563,6 +3564,16 @@
             }
         }
 
+        if (tmp.createdConfig != null) {
+            // If the activity manager is passing us its current config,
+            // assume that is really what we want regardless of what we
+            // may have pending.
+            if (mConfiguration == null
+                    || mConfiguration.diff(tmp.createdConfig) != 0) {
+                changedConfig = tmp.createdConfig;
+            }
+        }
+        
         if (DEBUG_CONFIGURATION) Log.v(TAG, "Relaunching activity "
                 + tmp.token + ": changedConfig=" + changedConfig);
         
diff --git a/core/java/android/app/ApplicationThreadNative.java b/core/java/android/app/ApplicationThreadNative.java
index a772a8f..7cba13f 100644
--- a/core/java/android/app/ApplicationThreadNative.java
+++ b/core/java/android/app/ApplicationThreadNative.java
@@ -140,7 +140,11 @@
             List<Intent> pi = data.createTypedArrayList(Intent.CREATOR);
             int configChanges = data.readInt();
             boolean notResumed = data.readInt() != 0;
-            scheduleRelaunchActivity(b, ri, pi, configChanges, notResumed);
+            Configuration config = null;
+            if (data.readInt() != 0) {
+                config = Configuration.CREATOR.createFromParcel(data);
+            }
+            scheduleRelaunchActivity(b, ri, pi, configChanges, notResumed, config);
             return true;
         }
         
@@ -491,7 +495,8 @@
 
     public final void scheduleRelaunchActivity(IBinder token,
             List<ResultInfo> pendingResults, List<Intent> pendingNewIntents,
-            int configChanges, boolean notResumed) throws RemoteException {
+            int configChanges, boolean notResumed, Configuration config)
+            throws RemoteException {
         Parcel data = Parcel.obtain();
         data.writeInterfaceToken(IApplicationThread.descriptor);
         data.writeStrongBinder(token);
@@ -499,6 +504,12 @@
         data.writeTypedList(pendingNewIntents);
         data.writeInt(configChanges);
         data.writeInt(notResumed ? 1 : 0);
+        if (config != null) {
+            data.writeInt(1);
+            config.writeToParcel(data, 0);
+        } else {
+            data.writeInt(0);
+        }
         mRemote.transact(SCHEDULE_RELAUNCH_ACTIVITY_TRANSACTION, data, null,
                 IBinder.FLAG_ONEWAY);
         data.recycle();
diff --git a/core/java/android/app/IApplicationThread.java b/core/java/android/app/IApplicationThread.java
index 89a52fd..ed810d3 100644
--- a/core/java/android/app/IApplicationThread.java
+++ b/core/java/android/app/IApplicationThread.java
@@ -56,7 +56,7 @@
     		throws RemoteException;
     void scheduleRelaunchActivity(IBinder token, List<ResultInfo> pendingResults,
             List<Intent> pendingNewIntents, int configChanges,
-            boolean notResumed) throws RemoteException;
+            boolean notResumed, Configuration config) throws RemoteException;
     void scheduleNewIntent(List<Intent> intent, IBinder token) throws RemoteException;
     void scheduleDestroyActivity(IBinder token, boolean finished,
             int configChanges) throws RemoteException;
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index d9c7d6f..fc47f93 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -12891,7 +12891,7 @@
         try {
             if (DEBUG_SWITCH) Log.i(TAG, "Switch is restarting resumed " + r);
             r.app.thread.scheduleRelaunchActivity(r, results, newIntents,
-                    changes, !andResume);
+                    changes, !andResume, mConfiguration);
             // Note: don't need to call pauseIfSleepingLocked() here, because
             // the caller will only pass in 'andResume' if this activity is
             // currently resumed, which implies we aren't sleeping.