AI 143274: FIX 1741378 and 1702095: Emergency calls get made to the wrong number(!)
David Brown [Fri, 27 Mar 2009 23:43:01 +0000 (16:43 -0700)]
  if you started out in airplane mode.
  In some cases when we launch the EmergencyCallHandler activity, we were
  launching it using the intent returned by getIntent(), which is NOT
  necessarily the most recent intent we were launched with.  (It's actually
  the intent from way back when the InCallScreen first got created).
  This has probably been broken since CL 132105, when we started keeping a
  single InCallScreen instance around for the entire life of the phone
  process.
  The fix is to simply call setIntent() to stash away the new intent any
  time one comes in via onNewIntent().  (The javadoc for
  Activity.onNewIntent() actually suggests doing this.)
  Watch out: Dianne says there's a known problem that the saved intent will
  get lost if there's a configuration change.  This is EXTREMELY unlikely to
  be a problem for the InCallScreen, though, since the call to getIntent()
  happens so quickly after the original onNewIntent/onResume sequence.
  (I filed bug 1743425 about the ActivityManager issue, though.)
  TESTED:
  - Various incoming / outgoing calls
  - Emergency call when initially in airplane mode
  BUG=1741378,1702095

Automated import of CL 143274

src/com/android/phone/InCallScreen.java

index 84e3887..5edc0ca 100644 (file)
@@ -842,14 +842,27 @@ public class InCallScreen extends Activity
     protected void onNewIntent(Intent intent) {
         if (DBG) log("onNewIntent: intent=" + intent);
 
-        // We're being re-launched with a new Intent, for example getting
-        // a new ACTION_CALL while we were already using the other line.
+        // We're being re-launched with a new Intent.  Since we keep
+        // around a single InCallScreen instance for the life of the phone
+        // process (see finish()), this sequence will happen EVERY time
+        // there's a new incoming or outgoing call except for the very
+        // first time the InCallScreen gets created.  This sequence will
+        // also happen if the InCallScreen is already in the foreground
+        // (e.g. getting a new ACTION_CALL intent while we were already
+        // using the other line.)
+
+        // Stash away the new intent so that we can get it in the future
+        // by calling getIntent().  (Otherwise getIntent() will return the
+        // original Intent from when we first got created!)
+        setIntent(intent);
+
         // Activities are always paused before receiving a new intent, so
         // we can count on our onResume() method being called next.
-        //
-        // So just like in onCreate(), we stash the result code from
-        // internalResolveIntent() in the mInCallInitialStatus field.
-        // If it's an error code, we'll handle it in onResume().
+
+        // Just like in onCreate(), handle this intent, and stash the
+        // result code from internalResolveIntent() in the
+        // mInCallInitialStatus field.  If it's an error code, we'll
+        // handle it in onResume().
         mInCallInitialStatus = internalResolveIntent(intent);
         if (mInCallInitialStatus != InCallInitStatus.SUCCESS) {
             Log.w(LOG_TAG, "onNewIntent: status " + mInCallInitialStatus
@@ -864,7 +877,7 @@ public class InCallScreen extends Activity
         }
 
         String action = intent.getAction();
-        if (VDBG) log("internalResolveIntent: action=" + action);
+        if (DBG) log("internalResolveIntent: action=" + action);
 
         // The calls to setRestoreMuteOnInCallResume() inform the phone
         // that we're dealing with new connections (either a placing an
@@ -1932,8 +1945,7 @@ public class InCallScreen extends Activity
             // expecting a callback when the emergency call handler dictates
             // it) and just return the success state.
             if (isEmergencyNumber && (okToCallStatus == InCallInitStatus.POWER_OFF)) {
-                startActivity(getIntent()
-                        .setClassName(this, EmergencyCallHandler.class.getName()));
+                startActivity(intent.setClassName(this, EmergencyCallHandler.class.getName()));
                 if (DBG) log("placeCall: starting EmergencyCallHandler, finishing...");
                 finish();
                 return InCallInitStatus.SUCCESS;