Merge "Turn screen on for call-waiting calls" into klp-dev
diff --git a/InCallUI/src/com/android/incallui/InCallPresenter.java b/InCallUI/src/com/android/incallui/InCallPresenter.java
index 4b38939..1b9f60c 100644
--- a/InCallUI/src/com/android/incallui/InCallPresenter.java
+++ b/InCallUI/src/com/android/incallui/InCallPresenter.java
@@ -568,7 +568,7 @@
             if (isActivityStarted()) {
                 mInCallActivity.dismissPendingDialogs();
             }
-            mStatusBarNotifier.updateNotificationAndLaunchIncomingCallUi(newState, mCallList);
+            startUi(newState);
         } else if (newState == InCallState.NO_CALLS) {
             // The new state is the no calls state.  Tear everything down.
             attemptFinishActivity();
@@ -577,6 +577,27 @@
         return newState;
     }
 
+    private void startUi(InCallState inCallState) {
+        final Call incomingCall = mCallList.getIncomingCall();
+        final boolean isCallWaiting = (incomingCall != null &&
+                incomingCall.getState() == Call.State.CALL_WAITING);
+
+        // If the screen is off, we need to make sure it gets turned on for incoming calls.
+        // This normally works just fine thanks to FLAG_TURN_SCREEN_ON but that only works
+        // when the activity is first created. Therefore, to ensure the screen is turned on
+        // for the call waiting case, we finish() the current activity and start a new one.
+        // There should be no jank from this since the screen is already off and will remain so
+        // until our new activity is up.
+        if (mProximitySensor.isScreenReallyOff() && isCallWaiting) {
+            if (isActivityStarted()) {
+                mInCallActivity.finish();
+            }
+            mInCallActivity = null;
+        }
+
+        mStatusBarNotifier.updateNotificationAndLaunchIncomingCallUi(inCallState, mCallList);
+    }
+
     /**
      * Checks to see if both the UI is gone and the service is disconnected. If so, tear it all
      * down.
diff --git a/InCallUI/src/com/android/incallui/ProximitySensor.java b/InCallUI/src/com/android/incallui/ProximitySensor.java
index 0da68ef..5776b56 100644
--- a/InCallUI/src/com/android/incallui/ProximitySensor.java
+++ b/InCallUI/src/com/android/incallui/ProximitySensor.java
@@ -154,6 +154,15 @@
     }
 
     /**
+     * TODO: There is no way to determine if a screen is off due to proximity or if it is
+     * legitimately off, but if ever we can do that in the future, it would be useful here.
+     * Until then, this function will simply return true of the screen is off.
+     */
+    public boolean isScreenReallyOff() {
+        return !mPowerManager.isScreenOn();
+    }
+
+    /**
      * @return true if this device supports the "proximity sensor
      * auto-lock" feature while in-call (see updateProximitySensorMode()).
      */