summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSantos Cordon <santoscordon@google.com>2014-09-04 16:16:51 -0700
committerSantos Cordon <santoscordon@google.com>2014-09-05 16:18:30 -0700
commit52c30ebe11e132c5b00a15aabdf4a411355bf0f4 (patch)
tree11bd21ac930d208b6adcfad423767cf82cffd2fd /src
parent913ee5e915bbfd799f412dcad903dc773680aea4 (diff)
downloadpackages_apps_InCallUI-52c30ebe11e132c5b00a15aabdf4a411355bf0f4.tar.gz
packages_apps_InCallUI-52c30ebe11e132c5b00a15aabdf4a411355bf0f4.tar.bz2
packages_apps_InCallUI-52c30ebe11e132c5b00a15aabdf4a411355bf0f4.zip
Support CDMA conference calling.
Bug:17316859 Change from using GENERIC_CONFERENCE to a better MANAGE_CONFERENCE. Change-Id: I0306aaa5cf4d35bf095d85db63b3d08395394645
Diffstat (limited to 'src')
-rw-r--r--src/com/android/incallui/Call.java16
-rw-r--r--src/com/android/incallui/CallButtonFragment.java7
-rw-r--r--src/com/android/incallui/CallButtonPresenter.java31
-rw-r--r--src/com/android/incallui/CallCardFragment.java23
-rw-r--r--src/com/android/incallui/CallCardPresenter.java29
-rw-r--r--src/com/android/incallui/CallList.java42
-rw-r--r--src/com/android/incallui/CallerInfoUtils.java3
-rw-r--r--src/com/android/incallui/InCallPresenter.java29
-rw-r--r--src/com/android/incallui/TelecommAdapter.java17
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());
@@ -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/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<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/src/com/android/incallui/CallCardFragment.java b/src/com/android/incallui/CallCardFragment.java
index 4bcc975c..3dc8ba74 100644
--- a/src/com/android/incallui/CallCardFragment.java
+++ b/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/src/com/android/incallui/CallCardPresenter.java b/src/com/android/incallui/CallCardPresenter.java
index 1335766b..fc0c9293 100644
--- a/src/com/android/incallui/CallCardPresenter.java
+++ b/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/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<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/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<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() {