From 21707a656d5097323627b5096276dfa509259150 Mon Sep 17 00:00:00 2001 From: Andrew Lee Date: Wed, 15 Oct 2014 11:04:20 -0700 Subject: Update Conference Manager UI after capability changes. Before, we just set the visibility of the disconnect and separate buttons based on the initial call capabilities when the fragment is created. This can actually change, for example if an IMS call changes to a circuit switch GMS call. To address this, now implement a call details listener on the conference manager presenter, and update the UI if there is a change to disconnect or separate capabilities on a call. This required rearranging some code in the fragment to accomodate these changes; we now no longer assume the code to set the visibility of the buttons is only called once. Bug: 17429707 Change-Id: I476202a21a8ce07568170cd0e046697df84df991 --- .../incallui/ConferenceManagerFragment.java | 67 +++++++++---------- .../incallui/ConferenceManagerPresenter.java | 76 ++++++++++++++-------- 2 files changed, 79 insertions(+), 64 deletions(-) (limited to 'InCallUI') diff --git a/InCallUI/src/com/android/incallui/ConferenceManagerFragment.java b/InCallUI/src/com/android/incallui/ConferenceManagerFragment.java index e7785c151..c6ae19a1c 100644 --- a/InCallUI/src/com/android/incallui/ConferenceManagerFragment.java +++ b/InCallUI/src/com/android/incallui/ConferenceManagerFragment.java @@ -61,8 +61,8 @@ public class ConferenceManagerFragment @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - final View parent = inflater.inflate(R.layout.conference_manager_fragment, container, - false); + final View parent = + inflater.inflate(R.layout.conference_manager_fragment, container, false); // Create list of conference call widgets mConferenceCallList = new ViewGroup[getPresenter().getMaxCallersInConference()]; @@ -70,6 +70,7 @@ public class ConferenceManagerFragment R.id.caller3, R.id.caller4 }; for (int i = 0; i < getPresenter().getMaxCallersInConference(); i++) { mConferenceCallList[i] = (ViewGroup) parent.findViewById(viewGroupIdList[i]); + initializeRow(mConferenceCallList[i], i); } mContactPhotoManager = @@ -81,6 +82,27 @@ public class ConferenceManagerFragment return parent; } + /** + * Setup listeners for disconnecting and separating child calls. + */ + private void initializeRow(View rowView, final int rowId) { + View endButton = rowView.findViewById(R.id.conferenceCallerDisconnect); + endButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + getPresenter().endConferenceConnection(rowId); + } + }); + + View separateButton = rowView.findViewById(R.id.conferenceCallerSeparate); + separateButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + getPresenter().separateConferenceConnection(rowId); + } + }); + } + @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); @@ -114,11 +136,7 @@ public class ConferenceManagerFragment @Override public void setRowVisible(int rowId, boolean on) { - if (on) { - mConferenceCallList[rowId].setVisibility(View.VISIBLE); - } else { - mConferenceCallList[rowId].setVisibility(View.GONE); - } + mConferenceCallList[rowId].setVisibility(on ? View.VISIBLE : View.GONE); } /** @@ -158,38 +176,15 @@ public class ConferenceManagerFragment } @Override - public final void setupEndButtonForRow(final int rowId, boolean canDisconnect) { + public void updateEndButtonForRow(int rowId, boolean canDisconnect) { View endButton = mConferenceCallList[rowId].findViewById(R.id.conferenceCallerDisconnect); - - // Comment - if (canDisconnect) { - endButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - getPresenter().endConferenceConnection(rowId); - } - }); - endButton.setVisibility(View.VISIBLE); - } else { - endButton.setVisibility(View.INVISIBLE); - } + endButton.setVisibility(canDisconnect ? View.VISIBLE : View.GONE); } @Override - public final void setupSeparateButtonForRow(final int rowId, boolean canSeparate) { - final View separateButton = + public void updateSeparateButtonForRow(int rowId, boolean canSeparate) { + View separateButton = mConferenceCallList[rowId].findViewById(R.id.conferenceCallerSeparate); - - if (canSeparate) { - separateButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - getPresenter().separateConferenceConnection(rowId); - } - }); - separateButton.setVisibility(View.VISIBLE); - } else { - separateButton.setVisibility(View.INVISIBLE); - } + separateButton.setVisibility(canSeparate ? View.VISIBLE : View.GONE); } -} \ No newline at end of file +} diff --git a/InCallUI/src/com/android/incallui/ConferenceManagerPresenter.java b/InCallUI/src/com/android/incallui/ConferenceManagerPresenter.java index 269f37d9c..555048da1 100644 --- a/InCallUI/src/com/android/incallui/ConferenceManagerPresenter.java +++ b/InCallUI/src/com/android/incallui/ConferenceManagerPresenter.java @@ -22,6 +22,7 @@ import android.telecom.PhoneCapabilities; import android.text.TextUtils; import com.android.incallui.ContactInfoCache.ContactCacheEntry; +import com.android.incallui.InCallPresenter.InCallDetailsListener; import com.android.incallui.InCallPresenter.InCallState; import com.android.incallui.InCallPresenter.InCallStateListener; @@ -32,11 +33,11 @@ import com.google.common.base.Preconditions; */ public class ConferenceManagerPresenter extends Presenter - implements InCallStateListener { + implements InCallStateListener, InCallDetailsListener { private static final int MAX_CALLERS_IN_CONFERENCE = 5; - private String[] mCallerIds; + private String[] mCallerIds = new String[0]; private Context mContext; @Override @@ -73,6 +74,26 @@ public class ConferenceManagerPresenter } } + @Override + public void onDetailsChanged(Call call, android.telecom.Call.Details details) { + boolean canDisconnect = PhoneCapabilities.can( + details.getCallCapabilities(), PhoneCapabilities.DISCONNECT_FROM_CONFERENCE); + boolean canSeparate = PhoneCapabilities.can( + details.getCallCapabilities(), PhoneCapabilities.SEPARATE_FROM_CONFERENCE); + + if (call.can(PhoneCapabilities.DISCONNECT_FROM_CONFERENCE) == canDisconnect + && call.can(PhoneCapabilities.SEPARATE_FROM_CONFERENCE) == canSeparate) { + return; + } + + for (int i = 0; i < mCallerIds.length; i++) { + if (mCallerIds[i] == call.getId()) { + getUi().updateSeparateButtonForRow(i, canSeparate); + getUi().updateEndButtonForRow(i, canDisconnect); + } + } + } + public void init(Context context, CallList callList) { mContext = Preconditions.checkNotNull(context); mContext = context; @@ -82,35 +103,33 @@ public class ConferenceManagerPresenter private void update(CallList callList) { // callList is non null, but getActiveOrBackgroundCall() may return null final Call currentCall = callList.getActiveOrBackgroundCall(); - if (currentCall != null) { - // getChildCallIds() always returns a valid Set - mCallerIds = currentCall.getChildCallIds().toArray(new String[0]); - } else { - mCallerIds = new String[0]; + if (currentCall == null) { + return; } + + // getChildCallIds() always returns a valid Set + mCallerIds = currentCall.getChildCallIds().toArray(new String[0]); Log.d(this, "Number of calls is " + String.valueOf(mCallerIds.length)); - // Users can split out a call from the conference call if there either the active call - // or the holding call is empty. If both are filled at the moment, users can not split out - // another call. + // Users can split out a call from the conference call if either the active call or the + // holding call is empty. If both are filled, users can not split out another call. final boolean hasActiveCall = (callList.getActiveCall() != null); final boolean hasHoldingCall = (callList.getBackgroundCall() != null); boolean canSeparate = !(hasActiveCall && hasHoldingCall); for (int i = 0; i < MAX_CALLERS_IN_CONFERENCE; i++) { if (i < mCallerIds.length) { - int callCapabilities = - callList.getCallById(currentCall.getChildCallIds().get(i)) - .getTelecommCall().getDetails().getCallCapabilities(); - boolean thisRowCanSeparate = canSeparate && - ((callCapabilities & PhoneCapabilities.SEPARATE_FROM_CONFERENCE) != 0); - boolean thisRowCanDisconnect = - ((callCapabilities & PhoneCapabilities.DISCONNECT_FROM_CONFERENCE) != 0); + Call call = callList.getCallById(currentCall.getChildCallIds().get(i)); + int callCapabilities = call.getTelecommCall().getDetails().getCallCapabilities(); + boolean thisRowCanSeparate = canSeparate && PhoneCapabilities.can( + callCapabilities, PhoneCapabilities.SEPARATE_FROM_CONFERENCE); + boolean thisRowCanDisconnect = PhoneCapabilities.can( + callCapabilities, PhoneCapabilities.DISCONNECT_FROM_CONFERENCE); // Fill in the row in the UI for this caller. - final ContactCacheEntry contactCache = ContactInfoCache.getInstance(mContext). - getInfo(mCallerIds[i]); + final ContactCacheEntry contactCache = + ContactInfoCache.getInstance(mContext).getInfo(mCallerIds[i]); updateManageConferenceRow( - i, + i /* row index */, contactCache, thisRowCanSeparate, thisRowCanDisconnect); @@ -133,10 +152,11 @@ public class ConferenceManagerPresenter * on this row in the UI. * @param canDisconnect if true, show a "Disconnect" button on this row in the UI. */ - public void updateManageConferenceRow(final int i, - final ContactCacheEntry contactCacheEntry, - boolean canSeparate, - boolean canDisconnect) { + public void updateManageConferenceRow( + final int i, + final ContactCacheEntry contactCacheEntry, + boolean canSeparate, + boolean canDisconnect) { if (contactCacheEntry != null) { // Activate this row of the Manage conference panel: @@ -150,8 +170,8 @@ public class ConferenceManagerPresenter number = null; } - getUi().setupSeparateButtonForRow(i, canSeparate); - getUi().setupEndButtonForRow(i, canDisconnect); + getUi().updateSeparateButtonForRow(i, canSeparate); + getUi().updateEndButtonForRow(i, canDisconnect); getUi().displayCallerInfoForConferenceRow(i, name, number, contactCacheEntry.label, contactCacheEntry.lookupKey, contactCacheEntry.displayPhotoUri); } else { @@ -182,7 +202,7 @@ public class ConferenceManagerPresenter void setRowVisible(int rowId, boolean on); void displayCallerInfoForConferenceRow(int rowId, String callerName, String callerNumber, String callerNumberType, String lookupKey, Uri photoUri); - void setupSeparateButtonForRow(int rowId, boolean canSeparate); - void setupEndButtonForRow(int rowId, boolean canDisconnect); + void updateSeparateButtonForRow(int rowId, boolean canSeparate); + void updateEndButtonForRow(int rowId, boolean canDisconnect); } } -- cgit v1.2.3