Merge "Unhiding MSIM APIs."
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 0d5f42e..1b015cf 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -983,6 +983,8 @@
<string name="incall_error_supp_service_reject">Can\'t reject call.</string>
<!-- In-call screen: message displayed in an error dialog -->
<string name="incall_error_supp_service_hangup">Can\'t release call(s).</string>
+ <!-- In-call screen: message displayed in an error dialog -->
+ <string name="incall_error_supp_service_hold">Can\'t hold calls.</string>
<!-- In-call screen: call failure message displayed in an error dialog when WFC is enabled, is wifi-only, and not connected to a wireless network. [CHAR_LIMIT=NONE] -->
<string name="incall_error_wfc_only_no_wireless_network">Connect to a wireless network to make a call.</string>
diff --git a/src/com/android/phone/CallNotifier.java b/src/com/android/phone/CallNotifier.java
index cfffb94..7836248 100644
--- a/src/com/android/phone/CallNotifier.java
+++ b/src/com/android/phone/CallNotifier.java
@@ -570,6 +570,9 @@
if (DBG) log("onSuppServiceFailed: displaying merge failure message");
mergeFailedString = mApplication.getResources().getString(
R.string.incall_error_supp_service_switch);
+ } else if (r.result == Phone.SuppService.HOLD) {
+ mergeFailedString = mApplication.getResources().getString(
+ R.string.incall_error_supp_service_hold);
}
PhoneDisplayMessage.displayErrorMessage(mApplication, mergeFailedString);
diff --git a/src/com/android/services/telephony/ImsConference.java b/src/com/android/services/telephony/ImsConference.java
index d1f4cc6..c039106 100644
--- a/src/com/android/services/telephony/ImsConference.java
+++ b/src/com/android/services/telephony/ImsConference.java
@@ -171,8 +171,8 @@
@Override
public void onConnectionCapabilitiesChanged(Connection c, int connectionCapabilities) {
- Log.d(this, "onCallCapabilitiesChanged: Connection: %s, callCapabilities: %s", c,
- connectionCapabilities);
+ Log.d(this, "onConnectionCapabilitiesChanged: Connection: %s," +
+ " connectionCapabilities: %s", c, connectionCapabilities);
int capabilites = ImsConference.this.getConnectionCapabilities();
setConnectionCapabilities(applyHostCapabilities(capabilites, connectionCapabilities));
}
@@ -269,37 +269,26 @@
* @return The merged capabilities to be applied to the conference.
*/
private int applyHostCapabilities(int conferenceCapabilities, int capabilities) {
- if (can(capabilities, Connection.CAPABILITY_SUPPORTS_VT_LOCAL_BIDIRECTIONAL)) {
- conferenceCapabilities = applyCapability(conferenceCapabilities,
- Connection.CAPABILITY_SUPPORTS_VT_LOCAL_BIDIRECTIONAL);
- } else {
- conferenceCapabilities = removeCapability(conferenceCapabilities,
- Connection.CAPABILITY_SUPPORTS_VT_LOCAL_BIDIRECTIONAL);
- }
+ conferenceCapabilities = changeCapability(conferenceCapabilities,
+ Connection.CAPABILITY_SUPPORTS_VT_LOCAL_BIDIRECTIONAL,
+ can(capabilities, Connection.CAPABILITY_SUPPORTS_VT_LOCAL_BIDIRECTIONAL));
- if (can(capabilities, Connection.CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL)) {
- conferenceCapabilities = applyCapability(conferenceCapabilities,
- Connection.CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL);
- } else {
- conferenceCapabilities = removeCapability(conferenceCapabilities,
- Connection.CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL);
- }
+ conferenceCapabilities = changeCapability(conferenceCapabilities,
+ Connection.CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL,
+ can(capabilities, Connection.CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL));
- if (can(capabilities, Connection.CAPABILITY_CAN_UPGRADE_TO_VIDEO)) {
- conferenceCapabilities = applyCapability(conferenceCapabilities,
- Connection.CAPABILITY_CAN_UPGRADE_TO_VIDEO);
- } else {
- conferenceCapabilities = removeCapability(conferenceCapabilities,
- Connection.CAPABILITY_CAN_UPGRADE_TO_VIDEO);
- }
+ conferenceCapabilities = changeCapability(conferenceCapabilities,
+ Connection.CAPABILITY_CANNOT_DOWNGRADE_VIDEO_TO_AUDIO,
+ can(capabilities, Connection.CAPABILITY_CANNOT_DOWNGRADE_VIDEO_TO_AUDIO));
- if (can(capabilities, Connection.CAPABILITY_HIGH_DEF_AUDIO)) {
- conferenceCapabilities = applyCapability(conferenceCapabilities,
- Connection.CAPABILITY_HIGH_DEF_AUDIO);
- } else {
- conferenceCapabilities = removeCapability(conferenceCapabilities,
- Connection.CAPABILITY_HIGH_DEF_AUDIO);
- }
+ conferenceCapabilities = changeCapability(conferenceCapabilities,
+ Connection.CAPABILITY_CAN_UPGRADE_TO_VIDEO,
+ can(capabilities, Connection.CAPABILITY_CAN_UPGRADE_TO_VIDEO));
+
+ conferenceCapabilities = changeCapability(conferenceCapabilities,
+ Connection.CAPABILITY_HIGH_DEF_AUDIO,
+ can(capabilities, Connection.CAPABILITY_HIGH_DEF_AUDIO));
+
return conferenceCapabilities;
}
@@ -452,14 +441,20 @@
// No-op
}
- private int applyCapability(int capabilities, int capability) {
- int newCapabilities = capabilities | capability;
- return newCapabilities;
- }
-
- private int removeCapability(int capabilities, int capability) {
- int newCapabilities = capabilities & ~capability;
- return newCapabilities;
+ /**
+ * Changes a capabilities bit-mask to add or remove a capability.
+ *
+ * @param capabilities The capabilities bit-mask.
+ * @param capability The capability to change.
+ * @param enabled Whether the capability should be set or removed.
+ * @return The capabilities bit-mask with the capability changed.
+ */
+ private int changeCapability(int capabilities, int capability, boolean enabled) {
+ if (enabled) {
+ return capabilities | capability;
+ } else {
+ return capabilities & ~capability;
+ }
}
/**
diff --git a/src/com/android/services/telephony/TelephonyConnection.java b/src/com/android/services/telephony/TelephonyConnection.java
index 339db6d..0142d64 100644
--- a/src/com/android/services/telephony/TelephonyConnection.java
+++ b/src/com/android/services/telephony/TelephonyConnection.java
@@ -34,6 +34,7 @@
import com.android.ims.ImsCallProfile;
import com.android.internal.telephony.Call;
import com.android.internal.telephony.CallStateException;
+import com.android.internal.telephony.Connection.Capability;
import com.android.internal.telephony.Connection.PostDialListener;
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.gsm.SuppServiceNotification;
@@ -71,12 +72,11 @@
private static final Map<String, String> sExtrasMap = createExtrasMap();
private static final int MSG_SET_VIDEO_STATE = 8;
- private static final int MSG_SET_LOCAL_VIDEO_CAPABILITY = 9;
- private static final int MSG_SET_REMOTE_VIDEO_CAPABILITY = 10;
- private static final int MSG_SET_VIDEO_PROVIDER = 11;
- private static final int MSG_SET_AUDIO_QUALITY = 12;
- private static final int MSG_SET_CONFERENCE_PARTICIPANTS = 13;
- private static final int MSG_CONNECTION_EXTRAS_CHANGED = 14;
+ private static final int MSG_SET_VIDEO_PROVIDER = 9;
+ private static final int MSG_SET_AUDIO_QUALITY = 10;
+ private static final int MSG_SET_CONFERENCE_PARTICIPANTS = 11;
+ private static final int MSG_CONNECTION_EXTRAS_CHANGED = 12;
+ private static final int MSG_SET_ORIGNAL_CONNECTION_CAPABILITIES = 13;
private final Handler mHandler = new Handler() {
@Override
@@ -157,18 +157,6 @@
setVideoState(videoState);
break;
- case MSG_SET_LOCAL_VIDEO_CAPABILITY:
- boolean localVideoCapable = false;
- localVideoCapable = (boolean) msg.obj;
- setLocalVideoCapable(localVideoCapable);
- break;
-
- case MSG_SET_REMOTE_VIDEO_CAPABILITY:
- boolean remoteVideoCapable = false;
- remoteVideoCapable = (boolean) msg.obj;
- setRemoteVideoCapable(remoteVideoCapable);
- break;
-
case MSG_SET_VIDEO_PROVIDER:
VideoProvider videoProvider = (VideoProvider) msg.obj;
setVideoProvider(videoProvider);
@@ -188,6 +176,10 @@
final Bundle extras = (Bundle) msg.obj;
updateExtras(extras);
break;
+
+ case MSG_SET_ORIGNAL_CONNECTION_CAPABILITIES:
+ setOriginalConnectionCapabilities(msg.arg1);
+ break;
}
}
};
@@ -229,26 +221,15 @@
mHandler.obtainMessage(MSG_SET_VIDEO_STATE, videoState).sendToTarget();
}
- /**
- * The {@link com.android.internal.telephony.Connection} has reported a change in local
- * video capability.
- *
- * @param capable True if capable.
+ /*
+ * The {@link com.android.internal.telephony.Connection} has reported a change in
+ * connection capability.
+ * @param capabilities bit mask containing voice or video or both capabilities.
*/
@Override
- public void onLocalVideoCapabilityChanged(boolean capable) {
- mHandler.obtainMessage(MSG_SET_LOCAL_VIDEO_CAPABILITY, capable).sendToTarget();
- }
-
- /**
- * The {@link com.android.internal.telephony.Connection} has reported a change in remote
- * video capability.
- *
- * @param capable True if capable.
- */
- @Override
- public void onRemoteVideoCapabilityChanged(boolean capable) {
- mHandler.obtainMessage(MSG_SET_REMOTE_VIDEO_CAPABILITY, capable).sendToTarget();
+ public void onConnectionCapabilitiesChanged(int capabilities) {
+ mHandler.obtainMessage(MSG_SET_ORIGNAL_CONNECTION_CAPABILITIES,
+ capabilities, 0).sendToTarget();
}
/**
@@ -343,23 +324,10 @@
private boolean mIsMultiParty = false;
/**
- * Determines if the {@link TelephonyConnection} has local video capabilities.
- * This is used when {@link TelephonyConnection#updateConnectionCapabilities()}} is called,
- * ensuring the appropriate capabilities are set. Since capabilities
- * can be rebuilt at any time it is necessary to track the video capabilities between rebuild.
- * The capabilities (including video capabilities) are communicated to the telecom
- * layer.
+ * The {@link com.android.internal.telephony.Connection} capabilities associated with the
+ * current {@link #mOriginalConnection}.
*/
- private boolean mLocalVideoCapable;
-
- /**
- * Determines if the {@link TelephonyConnection} has remote video capabilities.
- * This is used when {@link TelephonyConnection#updateConnectionCapabilities()}} is called,
- * ensuring the appropriate capabilities are set. Since capabilities can be rebuilt at any time
- * it is necessary to track the video capabilities between rebuild. The capabilities (including
- * video capabilities) are communicated to the telecom layer.
- */
- private boolean mRemoteVideoCapable;
+ private int mOriginalConnectionCapabilities;
/**
* Determines if the {@link TelephonyConnection} is using wifi.
@@ -594,7 +562,7 @@
}
/**
- * Builds call capabilities common to all TelephonyConnections. Namely, apply IMS-based
+ * Builds connection capabilities common to all TelephonyConnections. Namely, apply IMS-based
* capabilities.
*/
protected int buildConnectionCapabilities() {
@@ -623,16 +591,12 @@
protected final void updateConnectionCapabilities() {
int newCapabilities = buildConnectionCapabilities();
- newCapabilities = changeCapability(newCapabilities,
- CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL, mRemoteVideoCapable);
- newCapabilities = changeCapability(newCapabilities,
- CAPABILITY_SUPPORTS_VT_LOCAL_BIDIRECTIONAL, mLocalVideoCapable);
+ newCapabilities = applyOriginalConnectionCapabilities(newCapabilities);
newCapabilities = changeCapability(newCapabilities,
CAPABILITY_HIGH_DEF_AUDIO, mHasHighDefAudio);
newCapabilities = changeCapability(newCapabilities, CAPABILITY_WIFI, mIsWifi);
newCapabilities = changeCapability(newCapabilities, CAPABILITY_CAN_PAUSE_VIDEO,
- mIsVideoPauseSupported && mRemoteVideoCapable && mLocalVideoCapable);
-
+ mIsVideoPauseSupported && isVideoCapable());
newCapabilities = applyConferenceTerminationCapabilities(newCapabilities);
if (getConnectionCapabilities() != newCapabilities) {
@@ -687,8 +651,7 @@
// Set video state and capabilities
setVideoState(mOriginalConnection.getVideoState());
- setLocalVideoCapable(mOriginalConnection.isLocalVideoCapable());
- setRemoteVideoCapable(mOriginalConnection.isRemoteVideoCapable());
+ setOriginalConnectionCapabilities(mOriginalConnection.getConnectionCapabilities());
setWifi(mOriginalConnection.isWifi());
setVideoProvider(mOriginalConnection.getVideoProvider());
setAudioQuality(mOriginalConnection.getAudioQuality());
@@ -1077,10 +1040,24 @@
}
/**
- * Applies capabilities specific to conferences termination to the
- * {@code CallCapabilities} bit-mask.
+ * Determines if the current connection is video capable.
*
- * @param capabilities The {@code CallCapabilities} bit-mask.
+ * A connection is deemed to be video capable if the original connection capabilities state that
+ * both local and remote video is supported.
+ *
+ * @return {@code true} if the connection is video capable, {@code false} otherwise.
+ */
+ private boolean isVideoCapable() {
+ return can(mOriginalConnectionCapabilities, Capability.SUPPORTS_VT_LOCAL_BIDIRECTIONAL)
+ && can(mOriginalConnectionCapabilities,
+ Capability.SUPPORTS_VT_REMOTE_BIDIRECTIONAL);
+ }
+
+ /**
+ * Applies capabilities specific to conferences termination to the
+ * {@code ConnectionCapabilities} bit-mask.
+ *
+ * @param capabilities The {@code ConnectionCapabilities} bit-mask.
* @return The capabilities with the IMS conference capabilities applied.
*/
private int applyConferenceTerminationCapabilities(int capabilities) {
@@ -1097,43 +1074,42 @@
}
/**
- * Returns the local video capability state for the connection.
+ * Stores the new original connection capabilities, and applies them to the current connection,
+ * notifying any listeners as necessary.
*
- * @return {@code True} if the connection has local video capabilities.
+ * @param connectionCapabilities The original connection capabilties.
*/
- public boolean isLocalVideoCapable() {
- return mLocalVideoCapable;
- }
-
- /**
- * Returns the remote video capability state for the connection.
- *
- * @return {@code True} if the connection has remote video capabilities.
- */
- public boolean isRemoteVideoCapable() {
- return mRemoteVideoCapable;
- }
-
- /**
- * Sets whether video capability is present locally. Used during rebuild of the
- * capabilities to set the video call capabilities.
- *
- * @param capable {@code True} if video capable.
- */
- public void setLocalVideoCapable(boolean capable) {
- mLocalVideoCapable = capable;
+ public void setOriginalConnectionCapabilities(int connectionCapabilities) {
+ mOriginalConnectionCapabilities = connectionCapabilities;
updateConnectionCapabilities();
}
/**
- * Sets whether video capability is present remotely. Used during rebuild of the
- * capabilities to set the video call capabilities.
+ * Called to apply the capabilities present in the {@link #mOriginalConnection} to this
+ * {@link Connection}. Provides a mapping between the capabilities present in the original
+ * connection (see {@link com.android.internal.telephony.Connection.Capability}) and those in
+ * this {@link Connection}.
*
- * @param capable {@code True} if video capable.
+ * @param capabilities The capabilities bitmask from the {@link Connection}.
+ * @return the capabilities bitmask with the original connection capabilities remapped and
+ * applied.
*/
- public void setRemoteVideoCapable(boolean capable) {
- mRemoteVideoCapable = capable;
- updateConnectionCapabilities();
+ public int applyOriginalConnectionCapabilities(int capabilities) {
+ // We only support downgrading to audio if both the remote and local side support
+ // downgrading to audio.
+ boolean supportsDowngradeToAudio = can(mOriginalConnectionCapabilities,
+ Capability.SUPPORTS_DOWNGRADE_TO_VOICE_LOCAL |
+ Capability.SUPPORTS_DOWNGRADE_TO_VOICE_REMOTE);
+ capabilities = changeCapability(capabilities,
+ CAPABILITY_CANNOT_DOWNGRADE_VIDEO_TO_AUDIO, !supportsDowngradeToAudio);
+
+ capabilities = changeCapability(capabilities, CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL,
+ can(mOriginalConnectionCapabilities, Capability.SUPPORTS_VT_REMOTE_BIDIRECTIONAL));
+
+ capabilities = changeCapability(capabilities, CAPABILITY_SUPPORTS_VT_LOCAL_BIDIRECTIONAL,
+ can(mOriginalConnectionCapabilities, Capability.SUPPORTS_VT_LOCAL_BIDIRECTIONAL));
+
+ return capabilities;
}
/**