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

Commit 638973ef authored by Tyler Gunn's avatar Tyler Gunn
Browse files

Notify interested parties of D2D availability.

Add callback method to notify of D2D availability.  Used in Telephony to
inform interested parties on a per-call basis.

Test: Add Unit tests for case
Bug: 163085177
Change-Id: I6dcc47a115f45565b121b3ed9f7370dc83f871d2
parent 155a9824
Loading
Loading
Loading
Loading
+19 −1
Original line number Original line Diff line number Diff line
@@ -38,6 +38,7 @@ public class Communicator implements TransportProtocol.Callback {
     */
     */
    public interface Callback {
    public interface Callback {
        void onMessagesReceived(@NonNull Set<Message> messages);
        void onMessagesReceived(@NonNull Set<Message> messages);
        void onD2DAvailabilitychanged(boolean isAvailable);
    }
    }


    public static final int MESSAGE_CALL_RADIO_ACCESS_TYPE = 1;
    public static final int MESSAGE_CALL_RADIO_ACCESS_TYPE = 1;
@@ -158,6 +159,7 @@ public class Communicator implements TransportProtocol.Callback {
        Log.i(this, "onNegotiationSuccess: %s negotiated; setting active.",
        Log.i(this, "onNegotiationSuccess: %s negotiated; setting active.",
                protocol.getClass().getSimpleName());
                protocol.getClass().getSimpleName());
        mIsNegotiated = true;
        mIsNegotiated = true;
        notifyD2DStatus(true /* isAvailable */);
    }
    }


    /**
    /**
@@ -210,6 +212,7 @@ public class Communicator implements TransportProtocol.Callback {
        if (mActiveTransport == null) {
        if (mActiveTransport == null) {
            // No more protocols, exit.
            // No more protocols, exit.
            Log.i(this, "negotiateNextProtocol: no remaining transports.");
            Log.i(this, "negotiateNextProtocol: no remaining transports.");
            notifyD2DStatus(false /* isAvailable */);
            return;
            return;
        }
        }
        Log.i(this, "negotiateNextProtocol: trying %s",
        Log.i(this, "negotiateNextProtocol: trying %s",
@@ -224,7 +227,11 @@ public class Communicator implements TransportProtocol.Callback {
    private TransportProtocol getNextCandidateProtocol() {
    private TransportProtocol getNextCandidateProtocol() {
        TransportProtocol candidateProtocol = null;
        TransportProtocol candidateProtocol = null;
        if (mActiveTransport == null) {
        if (mActiveTransport == null) {
            if (mTransportProtocols.size() > 0) {
                candidateProtocol = mTransportProtocols.get(0);
                candidateProtocol = mTransportProtocols.get(0);
            } else {
                mIsNegotiated = false;
            }
        } else {
        } else {
            for (int ix = 0; ix < mTransportProtocols.size(); ix++) {
            for (int ix = 0; ix < mTransportProtocols.size(); ix++) {
                TransportProtocol protocol = mTransportProtocols.get(ix);
                TransportProtocol protocol = mTransportProtocols.get(ix);
@@ -240,6 +247,17 @@ public class Communicator implements TransportProtocol.Callback {
        return candidateProtocol;
        return candidateProtocol;
    }
    }


    /**
     * Notifies listeners (okay, {@link com.android.services.telephony.TelephonyConnection} when
     * the availability of D2D communication changes.
     * @param isAvailable {@code true} if D2D is available, {@code false} otherwise.
     */
    private void notifyD2DStatus(boolean isAvailable) {
        if (mCallback != null) {
            mCallback.onD2DAvailabilitychanged(isAvailable);
        }
    }

    public static String messageToString(int messageType) {
    public static String messageToString(int messageType) {
        switch (messageType) {
        switch (messageType) {
            case MESSAGE_CALL_RADIO_ACCESS_TYPE:
            case MESSAGE_CALL_RADIO_ACCESS_TYPE:
+33 −0
Original line number Original line Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.internal.telephony.d2d;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertEquals;


import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verify;
@@ -39,6 +40,7 @@ import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.MockitoAnnotations;


import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.List;
import java.util.Set;
import java.util.Set;


@@ -76,6 +78,37 @@ public class CommunicatorTest {
        verify(mTransportProtocols.get(1)).startNegotiation();
        verify(mTransportProtocols.get(1)).startNegotiation();
        assertEquals(mTransportProtocols.get(1), mCommunicator.getActiveTransport());
        assertEquals(mTransportProtocols.get(1), mCommunicator.getActiveTransport());
        mCallback.onNegotiationSuccess(mTransportProtocols.get(1));
        mCallback.onNegotiationSuccess(mTransportProtocols.get(1));
        verify(mCommunicatorCallback).onD2DAvailabilitychanged(eq(true));
    }

    /**
     * Verifies that D2D negotiation failed callback is invoked when D2D could not be negotiated.
     */
    @SmallTest
    @Test
    public void testNegotiationFailed() {
        mCommunicator = new Communicator(mTransportProtocols, mCommunicatorCallback);
        mCommunicator.onStateChanged(null, Connection.STATE_ACTIVE);
        verify(mTransportProtocols.get(0)).startNegotiation();
        assertEquals(mTransportProtocols.get(0), mCommunicator.getActiveTransport());
        // Assume negotiation on the first one failed.
        mCallback.onNegotiationFailed(mTransportProtocols.get(0));
        verify(mTransportProtocols.get(1)).startNegotiation();
        assertEquals(mTransportProtocols.get(1), mCommunicator.getActiveTransport());
        // Oops, the second one failed too; not negotiated!
        mCallback.onNegotiationFailed(mTransportProtocols.get(1));
        verify(mCommunicatorCallback).onD2DAvailabilitychanged(eq(false));
    }

    /**
     * Verifies that D2D negotiation failed callback is invoked when no transports are available.
     */
    @SmallTest
    @Test
    public void testNegotiationFailedNoProtocols() {
        mCommunicator = new Communicator(Collections.EMPTY_LIST, mCommunicatorCallback);
        mCommunicator.onStateChanged(null, Connection.STATE_ACTIVE);
        verify(mCommunicatorCallback).onD2DAvailabilitychanged(eq(false));
    }
    }


    /**
    /**