Merge "Rename Telecom Call Ids to include attempt" into nyc-mr1-dev
diff --git a/src/com/android/server/telecom/Call.java b/src/com/android/server/telecom/Call.java
index 982b337..0a967ac 100644
--- a/src/com/android/server/telecom/Call.java
+++ b/src/com/android/server/telecom/Call.java
@@ -103,7 +103,7 @@
void onExtrasRemoved(Call c, int source, List<String> keys);
void onHandleChanged(Call call);
void onCallerDisplayNameChanged(Call call);
- void onVideoStateChanged(Call call);
+ void onVideoStateChanged(Call call, int previousVideoState, int newVideoState);
void onTargetPhoneAccountChanged(Call call);
void onConnectionManagerPhoneAccountChanged(Call call);
void onPhoneAccountChanged(Call call);
@@ -160,7 +160,7 @@
@Override
public void onCallerDisplayNameChanged(Call call) {}
@Override
- public void onVideoStateChanged(Call call) {}
+ public void onVideoStateChanged(Call call, int previousVideoState, int newVideoState) {}
@Override
public void onTargetPhoneAccountChanged(Call call) {}
@Override
@@ -1918,11 +1918,14 @@
mVideoStateHistory = mVideoStateHistory | videoState;
}
- Log.event(this, Log.Events.VIDEO_STATE_CHANGED,
- VideoProfile.videoStateToString(videoState));
+ int previousVideoState = mVideoState;
mVideoState = videoState;
- for (Listener l : mListeners) {
- l.onVideoStateChanged(this);
+ if (mVideoState != previousVideoState) {
+ Log.event(this, Log.Events.VIDEO_STATE_CHANGED,
+ VideoProfile.videoStateToString(videoState));
+ for (Listener l : mListeners) {
+ l.onVideoStateChanged(this, previousVideoState, mVideoState);
+ }
}
if (VideoProfile.isVideo(videoState)) {
diff --git a/src/com/android/server/telecom/CallAudioManager.java b/src/com/android/server/telecom/CallAudioManager.java
index 75a0b55..0ff80f4 100644
--- a/src/com/android/server/telecom/CallAudioManager.java
+++ b/src/com/android/server/telecom/CallAudioManager.java
@@ -314,6 +314,25 @@
CallAudioRouteStateMachine.UPDATE_SYSTEM_AUDIO_ROUTE);
}
+ @Override
+ public void onVideoStateChanged(Call call, int previousVideoState, int newVideoState) {
+ if (call != getForegroundCall()) {
+ Log.d(LOG_TAG, "Ignoring video state change from %s to %s for call %s -- not " +
+ "foreground.", VideoProfile.videoStateToString(previousVideoState),
+ VideoProfile.videoStateToString(newVideoState), call.getId());
+ return;
+ }
+
+ if (!VideoProfile.isVideo(previousVideoState) &&
+ mCallsManager.isSpeakerphoneAutoEnabledForVideoCalls(newVideoState)) {
+ Log.d(LOG_TAG, "Switching to speaker because call %s transitioned video state from %s" +
+ " to %s", call.getId(), VideoProfile.videoStateToString(previousVideoState),
+ VideoProfile.videoStateToString(newVideoState));
+ mCallAudioRouteStateMachine.sendMessageWithSessionInfo(
+ CallAudioRouteStateMachine.SWITCH_SPEAKER);
+ }
+ }
+
public CallAudioState getCallAudioState() {
return mCallAudioRouteStateMachine.getCurrentCallAudioState();
}
diff --git a/src/com/android/server/telecom/CallsManager.java b/src/com/android/server/telecom/CallsManager.java
index 9cfd8ea..c13c8a2 100644
--- a/src/com/android/server/telecom/CallsManager.java
+++ b/src/com/android/server/telecom/CallsManager.java
@@ -102,7 +102,7 @@
void onRingbackRequested(Call call, boolean ringback);
void onIsConferencedChanged(Call call);
void onIsVoipAudioModeChanged(Call call);
- void onVideoStateChanged(Call call);
+ void onVideoStateChanged(Call call, int previousVideoState, int newVideoState);
void onCanAddCallChanged(boolean canAddCall);
void onSessionModifyRequestReceived(Call call, VideoProfile videoProfile);
void onHoldToneRequested(Call call);
@@ -496,9 +496,9 @@
}
@Override
- public void onVideoStateChanged(Call call) {
+ public void onVideoStateChanged(Call call, int previousVideoState, int newVideoState) {
for (CallsManagerListener listener : mListeners) {
- listener.onVideoStateChanged(call);
+ listener.onVideoStateChanged(call, previousVideoState, newVideoState);
}
}
@@ -930,7 +930,7 @@
final boolean useSpeakerWhenDocked = mContext.getResources().getBoolean(
R.bool.use_speaker_when_docked);
final boolean useSpeakerForDock = isSpeakerphoneEnabledForDock();
- final boolean useSpeakerForVideoCall = isSpeakerphoneAutoEnabled(videoState);
+ final boolean useSpeakerForVideoCall = isSpeakerphoneAutoEnabledForVideoCalls(videoState);
// Auto-enable speakerphone if the originating intent specified to do so, if the call
// is a video call, of if using speaker when docked
@@ -1029,7 +1029,7 @@
// We do not update the UI until we get confirmation of the answer() through
// {@link #markCallAsActive}.
call.answer(videoState);
- if (isSpeakerphoneAutoEnabled(videoState)) {
+ if (isSpeakerphoneAutoEnabledForVideoCalls(videoState)) {
call.setStartWithSpeakerphoneOn(true);
}
}
@@ -1043,7 +1043,7 @@
* @param videoState The video state of the call.
* @return {@code true} if the speakerphone should be enabled.
*/
- private boolean isSpeakerphoneAutoEnabled(int videoState) {
+ public boolean isSpeakerphoneAutoEnabledForVideoCalls(int videoState) {
return VideoProfile.isVideo(videoState) &&
!mWiredHeadsetManager.isPluggedIn() &&
!mBluetoothManager.isBluetoothAvailable() &&
@@ -1476,8 +1476,6 @@
}
int count = 0;
- boolean hasVideoCall = false;
- boolean disableAddCallDuringVideoCall = false;
for (Call call : mCalls) {
if (call.isEmergencyCall()) {
// We never support add call if one of the calls is an emergency call.
@@ -1485,11 +1483,11 @@
} else if (call.getParentCall() == null) {
count++;
}
- hasVideoCall |= call.getVideoState() != VideoProfile.STATE_AUDIO_ONLY;
Bundle extras = call.getExtras();
if (extras != null) {
- disableAddCallDuringVideoCall |= extras.getBoolean(
- Connection.EXTRA_DISABLE_ADD_CALL_DURING_VIDEO_CALL, false);
+ if (extras.getBoolean(Connection.EXTRA_DISABLE_ADD_CALL, false)) {
+ return false;
+ }
}
// We do not check states for canAddCall. We treat disconnected calls the same
@@ -1502,10 +1500,6 @@
}
}
- if (hasVideoCall && disableAddCallDuringVideoCall) {
- return false;
- }
-
return true;
}
diff --git a/src/com/android/server/telecom/CallsManagerListenerBase.java b/src/com/android/server/telecom/CallsManagerListenerBase.java
index 9bfa098..a4c76c1 100644
--- a/src/com/android/server/telecom/CallsManagerListenerBase.java
+++ b/src/com/android/server/telecom/CallsManagerListenerBase.java
@@ -69,7 +69,7 @@
}
@Override
- public void onVideoStateChanged(Call call) {
+ public void onVideoStateChanged(Call call, int previousVideoState, int newVideoState) {
}
@Override
diff --git a/src/com/android/server/telecom/ConnectionServiceWrapper.java b/src/com/android/server/telecom/ConnectionServiceWrapper.java
index 2d4a635..ca0e280 100644
--- a/src/com/android/server/telecom/ConnectionServiceWrapper.java
+++ b/src/com/android/server/telecom/ConnectionServiceWrapper.java
@@ -16,6 +16,7 @@
package com.android.server.telecom;
+import android.app.AppOpsManager;
import android.content.ComponentName;
import android.content.Context;
import android.net.Uri;
@@ -32,6 +33,7 @@
import android.telecom.GatewayInfo;
import android.telecom.ParcelableConference;
import android.telecom.ParcelableConnection;
+import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
import android.telecom.StatusHints;
import android.telecom.TelecomManager;
@@ -601,14 +603,39 @@
@Override
public void addExistingConnection(String callId, ParcelableConnection connection) {
Log.startSession("CSW.aEC");
+ UserHandle userHandle = Binder.getCallingUserHandle();
+ // Check that the Calling Package matches PhoneAccountHandle's Component Package
+ PhoneAccountHandle callingPhoneAccountHandle = connection.getPhoneAccount();
+ if (callingPhoneAccountHandle != null) {
+ mAppOpsManager.checkPackage(Binder.getCallingUid(),
+ callingPhoneAccountHandle.getComponentName().getPackageName());
+ }
long token = Binder.clearCallingIdentity();
try {
synchronized (mLock) {
- logIncoming("addExistingConnection %s %s", callId, connection);
- Call existingCall = mCallsManager
- .createCallForExistingConnection(callId, connection);
- mCallIdMapper.addCall(existingCall, callId);
- existingCall.setConnectionService(ConnectionServiceWrapper.this);
+ // Make sure that the PhoneAccount associated with the incoming
+ // ParcelableConnection is in fact registered to Telecom and is being called
+ // from the correct user.
+ List<PhoneAccountHandle> accountHandles =
+ mPhoneAccountRegistrar.getCallCapablePhoneAccounts(null /*uriScheme*/,
+ false /*includeDisabledAccounts*/, userHandle);
+ PhoneAccountHandle phoneAccountHandle = null;
+ for (PhoneAccountHandle accountHandle : accountHandles) {
+ if(accountHandle.equals(callingPhoneAccountHandle)) {
+ phoneAccountHandle = accountHandle;
+ }
+ }
+ if (phoneAccountHandle != null) {
+ logIncoming("addExistingConnection %s %s", callId, connection);
+ Call existingCall = mCallsManager
+ .createCallForExistingConnection(callId, connection);
+ mCallIdMapper.addCall(existingCall, callId);
+ existingCall.setConnectionService(ConnectionServiceWrapper.this);
+ } else {
+ Log.e(this, new RemoteException("The PhoneAccount being used is not " +
+ "currently registered with Telecom."), "Unable to " +
+ "addExistingConnection.");
+ }
}
} finally {
Binder.restoreCallingIdentity(token);
@@ -644,6 +671,7 @@
private final ConnectionServiceRepository mConnectionServiceRepository;
private final PhoneAccountRegistrar mPhoneAccountRegistrar;
private final CallsManager mCallsManager;
+ private final AppOpsManager mAppOpsManager;
/**
* Creates a connection service.
@@ -671,6 +699,7 @@
});
mPhoneAccountRegistrar = phoneAccountRegistrar;
mCallsManager = callsManager;
+ mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
}
/** See {@link IConnectionService#addConnectionServiceAdapter}. */
diff --git a/src/com/android/server/telecom/InCallController.java b/src/com/android/server/telecom/InCallController.java
index 2a43158..e0a9def 100644
--- a/src/com/android/server/telecom/InCallController.java
+++ b/src/com/android/server/telecom/InCallController.java
@@ -546,7 +546,7 @@
}
@Override
- public void onVideoStateChanged(Call call) {
+ public void onVideoStateChanged(Call call, int previousVideoState, int newVideoState) {
updateCall(call);
}