1 /* 2 * Copyright (C) 2023 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.telecom.cts; 18 19 import android.os.Bundle; 20 import android.os.OutcomeReceiver; 21 import android.os.ParcelUuid; 22 import android.telecom.CallControl; 23 import android.telecom.CallControlCallback; 24 import android.telecom.CallEndpoint; 25 import android.telecom.CallEventCallback; 26 import android.telecom.CallException; 27 import android.telecom.DisconnectCause; 28 import android.util.Log; 29 import android.util.Pair; 30 31 import androidx.annotation.NonNull; 32 33 import java.util.List; 34 import java.util.concurrent.CountDownLatch; 35 import java.util.function.Consumer; 36 37 public class TelecomCtsVoipCall { 38 39 private static final String TAG = "TelecomCtsVoipCall"; 40 private final String mCallId; 41 private String mTelecomCallId = ""; 42 CallControl mCallControl; 43 TelecomCtsVoipCall(String id)44 TelecomCtsVoipCall(String id) { 45 mCallId = id; 46 mEvents.mCallId = id; 47 } 48 getTelecomCallId()49 public ParcelUuid getTelecomCallId() { 50 return mCallControl.getCallId(); 51 } 52 onAddCallControl(@onNull CallControl callControl)53 public void onAddCallControl(@NonNull CallControl callControl) { 54 mCallControl = callControl; 55 mTelecomCallId = callControl.getCallId().toString(); 56 } 57 58 public CallControlCallback mHandshakes = new CallControlCallback() { 59 @Override 60 public void onSetActive(@NonNull Consumer<Boolean> wasCompleted) { 61 Log.i(TAG, String.format("onSetActive: callId=[%s]", mCallId)); 62 wasCompleted.accept(Boolean.TRUE); 63 } 64 65 @Override 66 public void onSetInactive(@NonNull Consumer<Boolean> wasCompleted) { 67 Log.i(TAG, String.format("onSetInactive: callId=[%s]", mCallId)); 68 wasCompleted.accept(Boolean.TRUE); 69 } 70 71 @Override 72 public void onAnswer(int videoState, @NonNull Consumer<Boolean> wasCompleted) { 73 Log.i(TAG, String.format("onAnswer: callId=[%s]", mCallId)); 74 wasCompleted.accept(Boolean.TRUE); 75 } 76 77 @Override 78 public void onDisconnect(DisconnectCause disconnectCause, Consumer<Boolean> wasCompleted) { 79 Log.i(TAG, String.format("onDisconnect: callId=[%s], disconnectCause=[%s]", 80 mCallId, disconnectCause)); 81 wasCompleted.accept(Boolean.TRUE); 82 } 83 84 @Override 85 public void onCallStreamingStarted(@NonNull Consumer<Boolean> wasCompleted) { 86 Log.i(TAG, String.format("onCallStreamingStarted: callId=[%s]", mCallId)); 87 } 88 }; 89 public CallEvent mEvents = new CallEvent(); 90 resetAllCallbackVerifiers()91 public void resetAllCallbackVerifiers() { 92 mEvents.resetAllCallbackVerifiers(); 93 } 94 95 public static class CallEvent implements CallEventCallback { 96 public String mCallId = ""; 97 private CallEndpoint mCallEndpoint; 98 private List<CallEndpoint> mAvailableEndpoints; 99 private boolean mIsMuted = false; 100 public boolean mWasMuteStateChangedCalled = false; 101 public Pair<String, Bundle> mLastEventReceived = null; 102 103 @Override onCallEndpointChanged(@onNull CallEndpoint newCallEndpoint)104 public void onCallEndpointChanged(@NonNull CallEndpoint newCallEndpoint) { 105 Log.i(TAG, String.format("onCallEndpointChanged: endpoint=[%s]", newCallEndpoint)); 106 mCallEndpoint = newCallEndpoint; 107 } 108 109 @Override onAvailableCallEndpointsChanged( @onNull List<CallEndpoint> availableEndpoints)110 public void onAvailableCallEndpointsChanged( 111 @NonNull List<CallEndpoint> availableEndpoints) { 112 Log.i(TAG, String.format("onAvailableCallEndpointsChanged: callId=[%s]", mCallId)); 113 for (CallEndpoint endpoint : availableEndpoints) { 114 Log.i(TAG, String.format("endpoint=[%s]", endpoint)); 115 } 116 mAvailableEndpoints = availableEndpoints; 117 } 118 119 @Override onMuteStateChanged(boolean isMuted)120 public void onMuteStateChanged(boolean isMuted) { 121 mIsMuted = isMuted; 122 mWasMuteStateChangedCalled = true; 123 } 124 125 @Override onCallStreamingFailed(int reason)126 public void onCallStreamingFailed(int reason) { 127 Log.i(TAG, String.format("onCallStreamingFailed: callId=[%s], reason=[%s]", mCallId, 128 reason)); 129 } 130 131 @Override onEvent(String event, Bundle extras)132 public void onEvent(String event, Bundle extras) { 133 Log.i(TAG, String.format("onEvent: callId=[%s], event=[%s]", mCallId, event)); 134 mLastEventReceived = new Pair<>(event, extras); 135 } 136 resetAllCallbackVerifiers()137 public void resetAllCallbackVerifiers() { 138 mWasMuteStateChangedCalled = false; 139 mLastEventReceived = null; 140 } 141 getCurrentCallEndpoint()142 public CallEndpoint getCurrentCallEndpoint() { 143 return mCallEndpoint; 144 } 145 getAvailableEndpoints()146 public List<CallEndpoint> getAvailableEndpoints() { 147 return mAvailableEndpoints; 148 } 149 isMuted()150 public boolean isMuted() { 151 return mIsMuted; 152 } 153 } 154 155 public static class LatchedOutcomeReceiver implements OutcomeReceiver<Void, CallException> { 156 CountDownLatch mCountDownLatch; 157 LatchedOutcomeReceiver(CountDownLatch latch)158 public LatchedOutcomeReceiver(CountDownLatch latch) { 159 mCountDownLatch = latch; 160 } 161 162 @Override onResult(Void result)163 public void onResult(Void result) { 164 Log.i(TAG, "latch is counting down"); 165 mCountDownLatch.countDown(); 166 } 167 168 @Override onError(@onNull CallException error)169 public void onError(@NonNull CallException error) { 170 Log.i(TAG, String.format("onError: code=[%d]", error.getCode())); 171 OutcomeReceiver.super.onError(error); 172 } 173 } 174 } 175