Notify new adding calls if the ICS has already bound.
For some reason, ICS may got bound before a new call added to
InCallController. In these cases, make sure that ICS got notified about
these calls.
Bug: 193596941
Test: TelecomUnitTests, manually test if a new incoming call during VOIP
can route to BT properly
Change-Id: Id4835922af707c7aa87b03f14af4eb61df2aca77
diff --git a/src/com/android/server/telecom/InCallController.java b/src/com/android/server/telecom/InCallController.java
index ce5e7e9..66029c5 100644
--- a/src/com/android/server/telecom/InCallController.java
+++ b/src/com/android/server/telecom/InCallController.java
@@ -45,7 +45,6 @@
import android.os.Trace;
import android.os.UserHandle;
import android.os.UserManager;
-import android.provider.DeviceConfig;
import android.telecom.CallAudioState;
import android.telecom.ConnectionService;
import android.telecom.InCallService;
@@ -282,7 +281,16 @@
@Override
public int connect(Call call) {
if (mIsConnected) {
- Log.addEvent(call, LogUtils.Events.INFO, "Already connected, ignoring request.");
+ Log.addEvent(call, LogUtils.Events.INFO, "Already connected, ignoring request: "
+ + mInCallServiceInfo);
+ if (call != null) {
+ // Track the call if we don't already know about it.
+ addCall(call);
+
+ // Notify this new added call
+ sendCallToService(call, mInCallServiceInfo,
+ mInCallServices.get(mInCallServiceInfo));
+ }
return CONNECTION_SUCCEEDED;
}
@@ -1864,34 +1872,7 @@
"calls", calls.size(), info.getComponentName());
int numCallsSent = 0;
for (Call call : calls) {
- try {
- if ((call.isSelfManaged() && (!info.isSelfManagedCallsSupported()
- || !call.visibleToInCallService())) ||
- (call.isExternalCall() && !info.isExternalCallsSupported())) {
- continue;
- }
-
- // Only send the RTT call if it's a UI in-call service
- boolean includeRttCall = false;
- if (mInCallServiceConnection != null) {
- includeRttCall = info.equals(mInCallServiceConnection.getInfo());
- }
-
- // Track the call if we don't already know about it.
- addCall(call);
- numCallsSent += 1;
- ParcelableCall parcelableCall = ParcelableCallUtils.toParcelableCall(
- call,
- true /* includeVideoProvider */,
- mCallsManager.getPhoneAccountRegistrar(),
- info.isExternalCallsSupported(),
- includeRttCall,
- info.getType() == IN_CALL_SERVICE_TYPE_SYSTEM_UI ||
- info.getType() == IN_CALL_SERVICE_TYPE_NON_UI);
- inCallService.addCall(sanitizeParcelableCallForService(info, parcelableCall));
- updateCallTracking(call, info, true /* isAdd */);
- } catch (RemoteException ignored) {
- }
+ numCallsSent += sendCallToService(call, info, inCallService);
}
try {
inCallService.onCallAudioStateChanged(mCallsManager.getAudioState());
@@ -1899,7 +1880,7 @@
} catch (RemoteException ignored) {
}
// Don't complete the binding future for non-ui incalls
- if (info.getType() != IN_CALL_SERVICE_TYPE_NON_UI) {
+ if (info.getType() != IN_CALL_SERVICE_TYPE_NON_UI && !mBindingFuture.isDone()) {
mBindingFuture.complete(true);
}
@@ -1907,6 +1888,39 @@
return true;
}
+ private int sendCallToService(Call call, InCallServiceInfo info,
+ IInCallService inCallService) {
+ try {
+ if ((call.isSelfManaged() && (!info.isSelfManagedCallsSupported()
+ || !call.visibleToInCallService())) ||
+ (call.isExternalCall() && !info.isExternalCallsSupported())) {
+ return 0;
+ }
+
+ // Only send the RTT call if it's a UI in-call service
+ boolean includeRttCall = false;
+ if (mInCallServiceConnection != null) {
+ includeRttCall = info.equals(mInCallServiceConnection.getInfo());
+ }
+
+ // Track the call if we don't already know about it.
+ addCall(call);
+ ParcelableCall parcelableCall = ParcelableCallUtils.toParcelableCall(
+ call,
+ true /* includeVideoProvider */,
+ mCallsManager.getPhoneAccountRegistrar(),
+ info.isExternalCallsSupported(),
+ includeRttCall,
+ info.getType() == IN_CALL_SERVICE_TYPE_SYSTEM_UI ||
+ info.getType() == IN_CALL_SERVICE_TYPE_NON_UI);
+ inCallService.addCall(sanitizeParcelableCallForService(info, parcelableCall));
+ updateCallTracking(call, info, true /* isAdd */);
+ return 1;
+ } catch (RemoteException ignored) {
+ }
+ return 0;
+ }
+
/**
* Cleans up an instance of in-call app after the service has been unbound.
*