From 52c30ebe11e132c5b00a15aabdf4a411355bf0f4 Mon Sep 17 00:00:00 2001 From: Santos Cordon Date: Thu, 4 Sep 2014 16:16:51 -0700 Subject: Support CDMA conference calling. Bug:17316859 Change from using GENERIC_CONFERENCE to a better MANAGE_CONFERENCE. Change-Id: I0306aaa5cf4d35bf095d85db63b3d08395394645 --- src/com/android/incallui/Call.java | 16 ++++----- src/com/android/incallui/CallButtonFragment.java | 7 +--- src/com/android/incallui/CallButtonPresenter.java | 31 +++++++++-------- src/com/android/incallui/CallCardFragment.java | 23 +++++++------ src/com/android/incallui/CallCardPresenter.java | 29 ++++++++-------- src/com/android/incallui/CallList.java | 42 +++++++++++++---------- src/com/android/incallui/CallerInfoUtils.java | 3 +- src/com/android/incallui/InCallPresenter.java | 29 ++++++---------- src/com/android/incallui/TelecommAdapter.java | 17 ++++++++- 9 files changed, 104 insertions(+), 93 deletions(-) diff --git a/src/com/android/incallui/Call.java b/src/com/android/incallui/Call.java index b2a19ab5..dd899b46 100644 --- a/src/com/android/incallui/Call.java +++ b/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/src/com/android/incallui/CallButtonFragment.java b/src/com/android/incallui/CallButtonFragment.java index ab1e49e8..2dae7a44 100644 --- a/src/com/android/incallui/CallButtonFragment.java +++ b/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()); @@ -287,11 +287,6 @@ public class CallButtonFragment mAddCallButton.setVisibility(show ? View.VISIBLE : View.GONE); } - @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/src/com/android/incallui/CallButtonPresenter.java b/src/com/android/incallui/CallButtonPresenter.java index 575df559..57c90be2 100644 --- a/src/com/android/incallui/CallButtonPresenter.java +++ b/src/com/android/incallui/CallButtonPresenter.java @@ -178,6 +178,15 @@ public class CallButtonPresenter extends Presenter } /** - * 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 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 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 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 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 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 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/src/com/android/incallui/CallList.java b/src/com/android/incallui/CallList.java index 7f76cd5d..8c5b467e 100644 --- a/src/com/android/incallui/CallList.java +++ b/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 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/src/com/android/incallui/CallerInfoUtils.java b/src/com/android/incallui/CallerInfoUtils.java index 08afcaf3..0abeb619 100644 --- a/src/com/android/incallui/CallerInfoUtils.java +++ b/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/src/com/android/incallui/InCallPresenter.java b/src/com/android/incallui/InCallPresenter.java index 24935fea..d633f27c 100644 --- a/src/com/android/incallui/InCallPresenter.java +++ b/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/src/com/android/incallui/TelecommAdapter.java b/src/com/android/incallui/TelecommAdapter.java index 1f5c9c59..a346cafb 100644 --- a/src/com/android/incallui/TelecommAdapter.java +++ b/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 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() { -- cgit v1.2.3