Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 17455a3d authored by Anthony Lee's avatar Anthony Lee
Browse files

Add plumbing for merge failures and renable button. (3/4)

The merge failure is not plumbed up through any layer that
can trap the callback and act on it.  The first part of this
fix is to create that plumbing.  Then we need to reenable the
merge button. At this point in time, we leverage the fact
that forcing the call to reassess its capabilities will poke
the InCallUI to reenable the merge button. In the future, we
should plumb the merge failure all the way to InCallUI and
not only handle the button but display UI to the user. The UI
is currently being displayed by CallNotifier which is the wrong
place. See b/20530631 for more details.

Bug: 20229905
Change-Id: I0355ada46b484c6db4bee656c77386dd61be5e1f
parent 2a550449
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -339,6 +339,7 @@ public abstract class Connection implements IConferenceable {
        public void onConferenceParticipantsChanged(Connection c,
                List<ConferenceParticipant> participants) {}
        public void onConferenceStarted() {}
        public void onConferenceMergeFailed(Connection c) {}
    }

    public static abstract class VideoProvider {
@@ -1546,6 +1547,17 @@ public abstract class Connection implements IConferenceable {
        mConferenceables.clear();
    }

    /**
     * Notifies listeners that the merge request failed.
     *
     * @hide
     */
    protected final void notifyConferenceMergeFailed() {
        for (Listener l : mListeners) {
            l.onConferenceMergeFailed(this);
        }
    }

    /**
     * Notifies listeners of a change to conference participant(s).
     *
+8 −0
Original line number Diff line number Diff line
@@ -562,6 +562,14 @@ public abstract class ConnectionService extends Service {
                mAdapter.setIsConferenced(id, conferenceId);
            }
        }

        @Override
        public void onConferenceMergeFailed(Connection connection) {
            String id = mIdByConnection.get(connection);
            if (id != null) {
                mAdapter.onConferenceMergeFailed(id);
            }
        }
    };

    /** {@inheritDoc} */
+15 −0
Original line number Diff line number Diff line
@@ -202,6 +202,21 @@ final class ConnectionServiceAdapter implements DeathRecipient {
        }
    }

    /**
     * Indicates that the merge request on this call has failed.
     *
     * @param callId The unique ID of the call being conferenced.
     */
    void onConferenceMergeFailed(String callId) {
        for (IConnectionServiceAdapter adapter : mAdapters) {
            try {
                Log.d(this, "merge failed for call %s", callId);
                adapter.setConferenceMergeFailed(callId);
            } catch (RemoteException ignored) {
            }
        }
    }

    /**
     * Indicates that the call no longer exists. Can be used with either a call or a conference
     * call.
+17 −0
Original line number Diff line number Diff line
@@ -59,6 +59,7 @@ final class ConnectionServiceAdapterServant {
    private static final int MSG_SET_CONFERENCEABLE_CONNECTIONS = 20;
    private static final int MSG_ADD_EXISTING_CONNECTION = 21;
    private static final int MSG_ON_POST_DIAL_CHAR = 22;
    private static final int MSG_SET_CONFERENCE_MERGE_FAILED = 23;

    private final IConnectionServiceAdapter mDelegate;

@@ -220,6 +221,15 @@ final class ConnectionServiceAdapterServant {
                    }
                    break;
                }
                case MSG_SET_CONFERENCE_MERGE_FAILED: {
                    SomeArgs args = (SomeArgs) msg.obj;
                    try {
                        mDelegate.setConferenceMergeFailed((String) args.arg1);
                    } finally {
                        args.recycle();
                    }
                    break;
                }
            }
        }
    };
@@ -279,6 +289,13 @@ final class ConnectionServiceAdapterServant {
                    .sendToTarget();
        }

        @Override
        public void setConferenceMergeFailed(String callId) {
            SomeArgs args = SomeArgs.obtain();
            args.arg1 = callId;
            mHandler.obtainMessage(MSG_SET_CONFERENCE_MERGE_FAILED, args).sendToTarget();
        }

        @Override
        public void setIsConferenced(String callId, String conferenceCallId) {
            SomeArgs args = SomeArgs.obtain();
+7 −0
Original line number Diff line number Diff line
@@ -170,6 +170,13 @@ final class RemoteConnectionService {
            }
        }

        @Override
        public void setConferenceMergeFailed(String callId) {
            // Nothing to do here.
            // The event has already been handled and there is no state to update
            // in the underlying connection or conference objects
        }

        @Override
        public void addConferenceCall(
                final String callId,
Loading