diff options
author | Santos Cordon <santoscordon@google.com> | 2014-09-04 16:16:51 -0700 |
---|---|---|
committer | Santos Cordon <santoscordon@google.com> | 2014-09-05 16:18:30 -0700 |
commit | 289d53ed1c879e983dcb021fa677212ab4566bbd (patch) | |
tree | e194145e5051b304c08aec93e23a571450512558 /InCallUI | |
parent | 19740915793f6aff39e1b1d45bcd90cf67915791 (diff) |
Support CDMA conference calling.
Bug:17316859
Change from using GENERIC_CONFERENCE to a better MANAGE_CONFERENCE.
Change-Id: I0306aaa5cf4d35bf095d85db63b3d08395394645
Diffstat (limited to 'InCallUI')
9 files changed, 104 insertions, 93 deletions
diff --git a/InCallUI/src/com/android/incallui/Call.java b/InCallUI/src/com/android/incallui/Call.java index b2a19ab53..dd899b46d 100644 --- a/InCallUI/src/com/android/incallui/Call.java +++ b/InCallUI/src/com/android/incallui/Call.java @@ -182,11 +182,6 @@ public final class Call { mTelecommCall = telecommCall; mId = ID_PREFIX + Integer.toString(sIdCounter++); updateFromTelecommCall(); - if (getState() == Call.State.INCOMING) { - CallList.getInstance().onIncoming(this, getCannedSmsResponses()); - } else { - CallList.getInstance().onUpdate(this); - } mTelecommCall.addListener(mTelecommCallListener); } @@ -306,12 +301,17 @@ public final class Call { /** Checks if the call supports the given set of capabilities supplied as a bit mask. */ public boolean can(int capabilities) { - if (PhoneCapabilities.MERGE_CALLS == (capabilities & PhoneCapabilities.MERGE_CALLS)) { - if (mTelecommCall.getConferenceableCalls().isEmpty()) { + int supportedCapabilities = mTelecommCall.getDetails().getCallCapabilities(); + + if ((capabilities & PhoneCapabilities.MERGE_CONFERENCE) != 0) { + // We allow you to merge if the capabilities allow it or if it is a call with + // conferenceable calls. + if (mTelecommCall.getConferenceableCalls().isEmpty() && + ((PhoneCapabilities.MERGE_CONFERENCE & supportedCapabilities) == 0)) { // Cannot merge calls if there are no calls to merge with. return false; } - capabilities &= ~PhoneCapabilities.MERGE_CALLS; + capabilities &= ~PhoneCapabilities.MERGE_CONFERENCE; } return (capabilities == (capabilities & mTelecommCall.getDetails().getCallCapabilities())); } diff --git a/InCallUI/src/com/android/incallui/CallButtonFragment.java b/InCallUI/src/com/android/incallui/CallButtonFragment.java index ab1e49e82..2dae7a444 100644 --- a/InCallUI/src/com/android/incallui/CallButtonFragment.java +++ b/InCallUI/src/com/android/incallui/CallButtonFragment.java @@ -165,7 +165,7 @@ public class CallButtonFragment break; } case R.id.swapButton: - getPresenter().holdClicked(true /* checked */); + getPresenter().swapClicked(); break; case R.id.dialpadButton: getPresenter().showDialpadClicked(!mShowDialpadButton.isSelected()); @@ -288,11 +288,6 @@ public class CallButtonFragment } @Override - public void enableAddCall(boolean enabled) { - mAddCallButton.setEnabled(enabled); - } - - @Override public void showMergeButton(boolean show) { mMergeButton.setVisibility(show ? View.VISIBLE : View.GONE); } diff --git a/InCallUI/src/com/android/incallui/CallButtonPresenter.java b/InCallUI/src/com/android/incallui/CallButtonPresenter.java index 575df5596..57c90be29 100644 --- a/InCallUI/src/com/android/incallui/CallButtonPresenter.java +++ b/InCallUI/src/com/android/incallui/CallButtonPresenter.java @@ -178,6 +178,15 @@ public class CallButtonPresenter extends Presenter<CallButtonPresenter.CallButto } } + public void swapClicked() { + if (mCall == null) { + return; + } + + Log.i(this, "Swapping the call: " + mCall); + TelecommAdapter.getInstance().swap(mCall.getId()); + } + public void mergeClicked() { TelecommAdapter.getInstance().merge(mCall.getId()); } @@ -330,30 +339,26 @@ public class CallButtonPresenter extends Presenter<CallButtonPresenter.CallButto Log.v(this, "Show hold ", call.can(PhoneCapabilities.SUPPORT_HOLD)); Log.v(this, "Enable hold", call.can(PhoneCapabilities.HOLD)); - Log.v(this, "Show merge ", call.can(PhoneCapabilities.MERGE_CALLS)); - Log.v(this, "Show swap ", call.can(PhoneCapabilities.SWAP_CALLS)); + Log.v(this, "Show merge ", call.can(PhoneCapabilities.MERGE_CONFERENCE)); + Log.v(this, "Show swap ", call.can(PhoneCapabilities.SWAP_CONFERENCE)); Log.v(this, "Show add call ", call.can(PhoneCapabilities.ADD_CALL)); Log.v(this, "Show mute ", call.can(PhoneCapabilities.MUTE)); final boolean canAdd = call.can(PhoneCapabilities.ADD_CALL); final boolean enableHoldOption = call.can(PhoneCapabilities.HOLD); final boolean supportHold = call.can(PhoneCapabilities.SUPPORT_HOLD); - final boolean isGenericConference = call.can(PhoneCapabilities.GENERIC_CONFERENCE); boolean canVideoCall = call.can(PhoneCapabilities.SUPPORTS_VT_LOCAL) && call.can(PhoneCapabilities.SUPPORTS_VT_REMOTE); ui.showChangeToVideoButton(canVideoCall); - // Show either MERGE or ADD. Only show both if, for CDMA, we're in a generic conference. - final boolean showMergeOption = call.can(PhoneCapabilities.MERGE_CALLS); - final boolean showAddCallOption = canAdd && (isGenericConference || !showMergeOption); - final boolean enableAddCallOption = showAddCallOption && canAdd; + final boolean showMergeOption = call.can(PhoneCapabilities.MERGE_CONFERENCE); + final boolean showAddCallOption = canAdd; + // Show either HOLD or SWAP, but not both. If neither HOLD or SWAP is available: // (1) If the device normally can hold, show HOLD in a disabled state. // (2) If the device doesn't have the concept of hold/swap, remove the button. - final CallList callList = CallList.getInstance(); - final boolean showSwapOption = enableHoldOption && (callList.getActiveCall() != null) - && (callList.getBackgroundCall() != null); + final boolean showSwapOption = call.can(PhoneCapabilities.SWAP_CONFERENCE); final boolean showHoldOption = !showSwapOption && (enableHoldOption || supportHold); ui.setHold(call.getState() == Call.State.ONHOLD); @@ -373,7 +378,7 @@ public class CallButtonPresenter extends Presenter<CallButtonPresenter.CallButto ui.showOverflowButton(true); ui.configureOverflowMenu( showMergeOption, - showAddCallOption && enableAddCallOption /* showAddMenuOption */, + showAddCallOption /* showAddMenuOption */, showHoldOption && enableHoldOption /* showHoldMenuOption */, showSwapOption); } else { @@ -383,13 +388,12 @@ public class CallButtonPresenter extends Presenter<CallButtonPresenter.CallButto ui.configureOverflowMenu( showMergeOption, - showAddCallOption && enableAddCallOption /* showAddMenuOption */, + showAddCallOption /* showAddMenuOption */, false /* showHoldMenuOption */, false /* showSwapMenuOption */); } else { ui.showMergeButton(showMergeOption); ui.showAddCallButton(showAddCallOption); - ui.enableAddCall(enableAddCallOption); } ui.showHoldButton(showHoldOption); @@ -425,7 +429,6 @@ public class CallButtonPresenter extends Presenter<CallButtonPresenter.CallButto void showSwitchCameraButton(boolean show); void setSwitchCameraButton(boolean isBackFacingCamera); void showAddCallButton(boolean show); - void enableAddCall(boolean enabled); void showMergeButton(boolean show); void showPauseVideoButton(boolean show); void setPauseVideoButton(boolean isPaused); diff --git a/InCallUI/src/com/android/incallui/CallCardFragment.java b/InCallUI/src/com/android/incallui/CallCardFragment.java index 4bcc975c9..3dc8ba747 100644 --- a/InCallUI/src/com/android/incallui/CallCardFragment.java +++ b/InCallUI/src/com/android/incallui/CallCardFragment.java @@ -429,12 +429,12 @@ public class CallCardFragment extends BaseFragment<CallCardPresenter, CallCardPr @Override public void setPrimary(String number, String name, boolean nameIsNumber, String label, - Drawable photo, boolean isConference, boolean isGeneric, boolean isSipCall) { + Drawable photo, boolean isConference, boolean canManageConference, boolean isSipCall) { Log.d(this, "Setting primary call"); if (isConference) { - name = getConferenceString(isGeneric); - photo = getConferencePhoto(isGeneric); + name = getConferenceString(canManageConference); + photo = getConferencePhoto(canManageConference); photo.setAutoMirrored(true); nameIsNumber = false; } @@ -460,7 +460,8 @@ public class CallCardFragment extends BaseFragment<CallCardPresenter, CallCardPr @Override public void setSecondary(boolean show, String name, boolean nameIsNumber, String label, - String providerLabel, Drawable providerIcon, boolean isConference, boolean isGeneric) { + String providerLabel, Drawable providerIcon, boolean isConference, + boolean canManageConference) { if (show != mSecondaryCallInfo.isShown()) { updateFabPositionOnSecondaryCallInfoLayout(); @@ -471,7 +472,7 @@ public class CallCardFragment extends BaseFragment<CallCardPresenter, CallCardPr showAndInitializeSecondaryCallInfo(hasProvider); if (isConference) { - name = getConferenceString(isGeneric); + name = getConferenceString(canManageConference); nameIsNumber = false; mSecondaryCallConferenceCallIcon.setVisibility(View.VISIBLE); } else { @@ -619,15 +620,15 @@ public class CallCardFragment extends BaseFragment<CallCardPresenter, CallCardPr } } - private String getConferenceString(boolean isGeneric) { - Log.v(this, "isGenericString: " + isGeneric); - final int resId = isGeneric ? R.string.card_title_in_call : R.string.card_title_conf_call; + private String getConferenceString(boolean canManageConference) { + Log.v(this, "canManageConferenceString: " + canManageConference); + final int resId = canManageConference ? R.string.card_title_conf_call : R.string.card_title_in_call; return getView().getResources().getString(resId); } - private Drawable getConferencePhoto(boolean isGeneric) { - Log.v(this, "isGenericPhoto: " + isGeneric); - final int resId = isGeneric ? R.drawable.picture_dialing : R.drawable.img_conference; + private Drawable getConferencePhoto(boolean canManageConference) { + Log.v(this, "canManageConferencePhoto: " + canManageConference); + final int resId = canManageConference ? R.drawable.img_conference : R.drawable.picture_dialing; return getView().getResources().getDrawable(resId); } diff --git a/InCallUI/src/com/android/incallui/CallCardPresenter.java b/InCallUI/src/com/android/incallui/CallCardPresenter.java index 1335766b0..fc0c9293f 100644 --- a/InCallUI/src/com/android/incallui/CallCardPresenter.java +++ b/InCallUI/src/com/android/incallui/CallCardPresenter.java @@ -294,9 +294,7 @@ public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi> } /** - * Only show the conference call button if we are not in a generic conference. - * On CDMA devices, instead of a manage conference call button, we show "add" and "merge" - * buttons in the {@link CallButtonFragment}. + * Only show the conference call button if we can manage the conference. */ private void maybeShowManageConferenceCallButton() { if (mPrimary == null) { @@ -304,8 +302,8 @@ public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi> return; } - final boolean isGenericConference = mPrimary.can(PhoneCapabilities.GENERIC_CONFERENCE); - getUi().showManageConferenceCallButton(mPrimary.isConferenceCall() && !isGenericConference); + final boolean canManageConference = mPrimary.can(PhoneCapabilities.MANAGE_CONFERENCE); + getUi().showManageConferenceCallButton(mPrimary.isConferenceCall() && canManageConference); } private void setCallbackNumber() { @@ -401,8 +399,8 @@ public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi> return call != null && call.isConferenceCall(); } - private static boolean isGenericConference(Call call) { - return call != null && call.can(PhoneCapabilities.GENERIC_CONFERENCE); + private static boolean canManageConference(Call call) { + return call != null && call.can(PhoneCapabilities.MANAGE_CONFERENCE); } private void updateContactEntry(ContactCacheEntry entry, boolean isPrimary, @@ -468,15 +466,15 @@ public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi> return; } - final boolean isGenericConf = isGenericConference(mPrimary); + final boolean canManageConference = canManageConference(mPrimary); if (entry != null && mPrimary != null) { final String name = getNameForCall(entry); final String number = getNumberForCall(entry); final boolean nameIsNumber = name != null && name.equals(entry.number); ui.setPrimary(number, name, nameIsNumber, entry.label, - entry.photo, isConference, isGenericConf, entry.isSipCall); + entry.photo, isConference, canManageConference, entry.isSipCall); } else { - ui.setPrimary(null, null, false, null, null, isConference, isGenericConf, false); + ui.setPrimary(null, null, false, null, null, isConference, canManageConference, false); } } @@ -487,7 +485,7 @@ public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi> return; } - final boolean isGenericConf = isGenericConference(mSecondary); + final boolean canManageConference = canManageConference(mSecondary); if (mSecondaryContactInfo != null && mSecondary != null) { Log.d(TAG, "updateSecondaryDisplayInfo() " + mSecondaryContactInfo); final String nameForCall = getNameForCall(mSecondaryContactInfo); @@ -496,10 +494,10 @@ public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi> mSecondaryContactInfo.number); ui.setSecondary(true /* show */, nameForCall, nameIsNumber, mSecondaryContactInfo.label, getCallProviderLabel(mSecondary), getCallProviderIcon(mSecondary), - isConference, isGenericConf); + isConference, canManageConference); } else { // reset to nothing so that it starts off blank next time we use it. - ui.setSecondary(false, null, false, null, null, null, isConference, isGenericConf); + ui.setSecondary(false, null, false, null, null, null, isConference, canManageConference); } } @@ -659,10 +657,11 @@ public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi> void setVisible(boolean on); void setCallCardVisible(boolean visible); void setPrimary(String number, String name, boolean nameIsNumber, String label, - Drawable photo, boolean isConference, boolean isGeneric, boolean isSipCall); + Drawable photo, boolean isConference, boolean canManageConference, + boolean isSipCall); void setSecondary(boolean show, String name, boolean nameIsNumber, String label, String providerLabel, Drawable providerIcon, boolean isConference, - boolean isGeneric); + boolean canManageConference); void setCallState(int state, int videoState, int sessionModificationState, int cause, String connectionLabel, Drawable connectionIcon, String gatewayNumber); void setPrimaryCallElapsedTime(boolean show, String duration); diff --git a/InCallUI/src/com/android/incallui/CallList.java b/InCallUI/src/com/android/incallui/CallList.java index 7f76cd5dd..8c5b467ec 100644 --- a/InCallUI/src/com/android/incallui/CallList.java +++ b/InCallUI/src/com/android/incallui/CallList.java @@ -71,15 +71,24 @@ public class CallList implements InCallPhoneListener { private Phone.Listener mPhoneListener = new Phone.Listener() { @Override - public void onCallAdded(Phone phone, android.telecomm.Call call) { - // TODO: The Call adds itself to various singletons within its ctor. Refactor - // so that this is done more explicitly; otherwise, the below looks like we're creating - // an object and never using it. - new Call(call); + public void onCallAdded(Phone phone, android.telecomm.Call telecommCall) { + Call call = new Call(telecommCall); + if (call.getState() == Call.State.INCOMING) { + onIncoming(call, call.getCannedSmsResponses()); + } else { + onUpdate(call); + } } @Override - public void onCallRemoved(Phone phone, android.telecomm.Call call) { - // Handled by disconnection cascade from the Call itself + public void onCallRemoved(Phone phone, android.telecomm.Call telecommCall) { + if (mCallByTelecommCall.containsKey(telecommCall)) { + Call call = mCallByTelecommCall.get(telecommCall); + call.setState(Call.State.DISCONNECTED); + call.setDisconnectCause(DisconnectCause.NOT_VALID); + if (updateCallInMap(call)) { + Log.w(this, "Removing call not previously disconnected " + call.getId()); + } + } } }; @@ -105,14 +114,10 @@ public class CallList implements InCallPhoneListener { * Called when a single call disconnects. */ public void onDisconnect(Call call) { - Log.d(this, "onDisconnect: ", call); - - boolean updated = updateCallInMap(call); - - if (updated) { + if (updateCallInMap(call)) { + Log.i(this, "onDisconnect: " + call); // notify those listening for changes on this specific change notifyCallUpdateListeners(call); - // notify those listening for all disconnects notifyListenersOfDisconnect(call); } @@ -122,9 +127,9 @@ public class CallList implements InCallPhoneListener { * Called when a single call has changed. */ public void onIncoming(Call call, List<String> textMessages) { - Log.d(this, "onIncoming - " + call); - - updateCallInMap(call); + if (updateCallInMap(call)) { + Log.i(this, "onIncoming - " + call); + } updateCallTextMap(call, textMessages); for (Listener listener : mListeners) { @@ -137,7 +142,6 @@ public class CallList implements InCallPhoneListener { */ public void onUpdate(Call call) { onUpdateCall(call); - Log.d(this, "onUpdate - ", call); notifyGenericListeners(); } @@ -373,7 +377,9 @@ public class CallList implements InCallPhoneListener { */ private void onUpdateCall(Call call) { Log.d(this, "\t" + call); - updateCallInMap(call); + if (updateCallInMap(call)) { + Log.i(this, "onUpdate - " + call); + } updateCallTextMap(call, null); notifyCallUpdateListeners(call); } diff --git a/InCallUI/src/com/android/incallui/CallerInfoUtils.java b/InCallUI/src/com/android/incallui/CallerInfoUtils.java index 08afcaf32..0abeb6199 100644 --- a/InCallUI/src/com/android/incallui/CallerInfoUtils.java +++ b/InCallUI/src/com/android/incallui/CallerInfoUtils.java @@ -74,7 +74,8 @@ public class CallerInfoUtils { // Because the InCallUI is immediately launched before the call is connected, occasionally // a voicemail call will be passed to InCallUI as a "voicemail:" URI without a number. // This call should still be handled as a voicemail call. - if (CallUtil.SCHEME_VOICEMAIL.equals(call.getHandle().getScheme())) { + if (call.getHandle() != null && + CallUtil.SCHEME_VOICEMAIL.equals(call.getHandle().getScheme())) { info.markAsVoiceMail(context); } diff --git a/InCallUI/src/com/android/incallui/InCallPresenter.java b/InCallUI/src/com/android/incallui/InCallPresenter.java index 24935fea1..d633f27c8 100644 --- a/InCallUI/src/com/android/incallui/InCallPresenter.java +++ b/InCallUI/src/com/android/incallui/InCallPresenter.java @@ -654,26 +654,17 @@ public class InCallPresenter implements CallList.Listener, InCallPhoneListener { if (activeCall != null) { // TODO: This logic is repeated from CallButtonPresenter.java. We should // consolidate this logic. - final boolean isGeneric = activeCall.can(PhoneCapabilities.GENERIC_CONFERENCE); - final boolean canMerge = activeCall.can(PhoneCapabilities.MERGE_CALLS); - final boolean canSwap = activeCall.can(PhoneCapabilities.SWAP_CALLS); - - Log.v(this, "activeCall: " + activeCall + ", isGeneric: " + isGeneric + ", canMerge: " + - canMerge + ", canSwap: " + canSwap); - - // (2) Attempt actions on Generic conference calls - if (activeCall.isConferenceCall() && isGeneric) { - if (canMerge) { - TelecommAdapter.getInstance().merge(activeCall.getId()); - return true; - } else if (canSwap) { - TelecommAdapter.getInstance().swap(activeCall.getId()); - return true; - } - } + final boolean canMerge = activeCall.can(PhoneCapabilities.MERGE_CONFERENCE); + final boolean canSwap = activeCall.can(PhoneCapabilities.SWAP_CONFERENCE); + + Log.v(this, "activeCall: " + activeCall + ", canMerge: " + canMerge + + ", canSwap: " + canSwap); - // (3) Swap calls - if (canSwap) { + // (2) Attempt actions on conference calls + if (canMerge) { + TelecommAdapter.getInstance().merge(activeCall.getId()); + return true; + } else if (canSwap) { TelecommAdapter.getInstance().swap(activeCall.getId()); return true; } diff --git a/InCallUI/src/com/android/incallui/TelecommAdapter.java b/InCallUI/src/com/android/incallui/TelecommAdapter.java index 1f5c9c59b..a346cafb0 100644 --- a/InCallUI/src/com/android/incallui/TelecommAdapter.java +++ b/InCallUI/src/com/android/incallui/TelecommAdapter.java @@ -24,6 +24,8 @@ import android.telecomm.InCallAdapter; import android.telecomm.Phone; import android.telecomm.PhoneAccountHandle; +import android.telecomm.PhoneCapabilities; + import com.google.common.base.Preconditions; import java.util.List; @@ -151,6 +153,11 @@ final class TelecommAdapter implements InCallPhoneListener { List<android.telecomm.Call> conferenceable = call.getConferenceableCalls(); if (!conferenceable.isEmpty()) { call.conference(conferenceable.get(0)); + } else { + int capabilities = call.getDetails().getCallCapabilities(); + if (0 != (capabilities & PhoneCapabilities.MERGE_CONFERENCE)) { + call.mergeConference(); + } } } else { Log.e(this, "error merge, mPhone is null."); @@ -158,7 +165,15 @@ final class TelecommAdapter implements InCallPhoneListener { } void swap(String callId) { - // TODO: Remove (obsolete) + if (mPhone != null) { + android.telecomm.Call call = getTelecommCallById(callId); + int capabilities = call.getDetails().getCallCapabilities(); + if (0 != (capabilities & PhoneCapabilities.SWAP_CONFERENCE)) { + call.swapConference(); + } + } else { + Log.e(this, "Error swap, mPhone is null."); + } } void addCall() { |