Home | History | Annotate | Download | only in cts
      1 /*
      2  * Copyright (C) 2015 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 static android.telecom.CallAudioState.*;
     20 
     21 import android.net.Uri;
     22 import android.os.Bundle;
     23 import android.telecom.CallAudioState;
     24 import android.telecom.Connection;
     25 import android.telecom.DisconnectCause;
     26 import android.telecom.PhoneAccountHandle;
     27 import android.telecom.RemoteConnection;
     28 import android.telecom.VideoProfile;
     29 import android.telecom.cts.TestUtils.InvokeCounter;
     30 import android.util.SparseArray;
     31 
     32 /**
     33  * {@link Connection} subclass that immediately performs any state changes that are a result of
     34  * callbacks sent from Telecom.
     35  */
     36 public class MockConnection extends Connection {
     37     public static final int ON_POST_DIAL_WAIT = 1;
     38     public static final int ON_CALL_EVENT = 2;
     39     public static final int ON_PULL_EXTERNAL_CALL = 3;
     40     public static final int ON_EXTRAS_CHANGED = 4;
     41     public static final int ON_START_RTT = 5;
     42     public static final int ON_RTT_REQUEST_RESPONSE = 6;
     43     public static final int ON_STOP_RTT = 7;
     44     public static final int ON_DEFLECT = 8;
     45     public static final int ON_SILENCE = 9;
     46 
     47     private CallAudioState mCallAudioState =
     48             new CallAudioState(false, CallAudioState.ROUTE_EARPIECE, ROUTE_EARPIECE | ROUTE_SPEAKER);
     49     private int mState = STATE_NEW;
     50     public int videoState = VideoProfile.STATE_AUDIO_ONLY;
     51     private String mDtmfString = "";
     52     private MockVideoProvider mMockVideoProvider;
     53     private PhoneAccountHandle mPhoneAccountHandle;
     54     private RemoteConnection mRemoteConnection = null;
     55     private RttTextStream mRttTextStream;
     56 
     57     private SparseArray<InvokeCounter> mInvokeCounterMap = new SparseArray<>(10);
     58 
     59     @Override
     60     public void onAnswer() {
     61         super.onAnswer();
     62     }
     63 
     64     @Override
     65     public void onAnswer(int videoState) {
     66         super.onAnswer(videoState);
     67         this.videoState = videoState;
     68         setActive();
     69         if (mRemoteConnection != null) {
     70             mRemoteConnection.answer();
     71         }
     72     }
     73 
     74     @Override
     75     public void onReject() {
     76         super.onReject();
     77         setDisconnected(new DisconnectCause(DisconnectCause.REJECTED));
     78         if (mRemoteConnection != null) {
     79             mRemoteConnection.reject();
     80         }
     81         destroy();
     82     }
     83 
     84     @Override
     85     public void onReject(String reason) {
     86         super.onReject();
     87         setDisconnected(new DisconnectCause(DisconnectCause.REJECTED, reason));
     88         if (mRemoteConnection != null) {
     89             mRemoteConnection.reject();
     90         }
     91         destroy();
     92     }
     93 
     94     @Override
     95     public void onHold() {
     96         super.onHold();
     97         setOnHold();
     98         if (mRemoteConnection != null) {
     99             mRemoteConnection.hold();
    100         }
    101     }
    102 
    103     @Override
    104     public void onUnhold() {
    105         super.onUnhold();
    106         setActive();
    107         if (mRemoteConnection != null) {
    108             mRemoteConnection.unhold();
    109         }
    110     }
    111 
    112     @Override
    113     public void onDisconnect() {
    114         super.onDisconnect();
    115         setDisconnected(new DisconnectCause(DisconnectCause.LOCAL));
    116         if (mRemoteConnection != null) {
    117             mRemoteConnection.disconnect();
    118         }
    119         destroy();
    120     }
    121 
    122     @Override
    123     public void onAbort() {
    124         super.onAbort();
    125         setDisconnected(new DisconnectCause(DisconnectCause.UNKNOWN));
    126         if (mRemoteConnection != null) {
    127             mRemoteConnection.abort();
    128         }
    129         destroy();
    130     }
    131 
    132     @Override
    133     public void onPlayDtmfTone(char c) {
    134         super.onPlayDtmfTone(c);
    135         mDtmfString += c;
    136         if (mRemoteConnection != null) {
    137             mRemoteConnection.playDtmfTone(c);
    138         }
    139     }
    140 
    141     @Override
    142     public void onStopDtmfTone() {
    143         super.onStopDtmfTone();
    144         mDtmfString += ".";
    145         if (mRemoteConnection != null) {
    146             mRemoteConnection.stopDtmfTone();
    147         }
    148     }
    149 
    150     @Override
    151     public void onCallAudioStateChanged(CallAudioState state) {
    152         super.onCallAudioStateChanged(state);
    153         mCallAudioState = state;
    154         if (mRemoteConnection != null) {
    155             mRemoteConnection.setCallAudioState(state);
    156         }
    157     }
    158 
    159     @Override
    160     public void onStateChanged(int state) {
    161         super.onStateChanged(state);
    162         mState = state;
    163     }
    164 
    165     @Override
    166     public void onPostDialContinue(boolean proceed) {
    167         super.onPostDialContinue(proceed);
    168         if (mInvokeCounterMap.get(ON_POST_DIAL_WAIT) != null) {
    169             mInvokeCounterMap.get(ON_POST_DIAL_WAIT).invoke(proceed);
    170         }
    171     }
    172 
    173     @Override
    174     public void onCallEvent(String event, Bundle extras) {
    175         super.onCallEvent(event, extras);
    176         if (mInvokeCounterMap.get(ON_CALL_EVENT) != null) {
    177             mInvokeCounterMap.get(ON_CALL_EVENT).invoke(event, extras);
    178         }
    179     }
    180 
    181     @Override
    182     public void onPullExternalCall() {
    183         super.onPullExternalCall();
    184         if (mInvokeCounterMap.get(ON_PULL_EXTERNAL_CALL) != null) {
    185             mInvokeCounterMap.get(ON_PULL_EXTERNAL_CALL).invoke();
    186         }
    187     }
    188 
    189     @Override
    190     public void onExtrasChanged(Bundle extras) {
    191         super.onExtrasChanged(extras);
    192         if (mInvokeCounterMap.get(ON_EXTRAS_CHANGED) != null) {
    193             mInvokeCounterMap.get(ON_EXTRAS_CHANGED).invoke(extras);
    194         }
    195     }
    196 
    197     @Override
    198     public void onStartRtt(RttTextStream rttTextStream) {
    199         super.onStartRtt(rttTextStream);
    200         if (mInvokeCounterMap.get(ON_START_RTT) != null) {
    201             mInvokeCounterMap.get(ON_START_RTT).invoke(rttTextStream);
    202         }
    203     }
    204 
    205     @Override
    206     public void handleRttUpgradeResponse(RttTextStream rttTextStream) {
    207         super.handleRttUpgradeResponse(rttTextStream);
    208         if (rttTextStream != null) {
    209             setRttTextStream(rttTextStream);
    210             setConnectionProperties(getConnectionProperties() | PROPERTY_IS_RTT);
    211         }
    212 
    213         if (mInvokeCounterMap.get(ON_RTT_REQUEST_RESPONSE) != null) {
    214             mInvokeCounterMap.get(ON_RTT_REQUEST_RESPONSE).invoke(rttTextStream);
    215         }
    216     }
    217 
    218     @Override
    219     public void onStopRtt() {
    220         super.onStopRtt();
    221 
    222         if (mInvokeCounterMap.get(ON_STOP_RTT) != null) {
    223             mInvokeCounterMap.get(ON_STOP_RTT).invoke();
    224         }
    225     }
    226 
    227     @Override
    228     public void onDeflect(Uri address) {
    229         if (mInvokeCounterMap.get(ON_DEFLECT) != null) {
    230             mInvokeCounterMap.get(ON_DEFLECT).invoke(address);
    231         }
    232     }
    233 
    234     @Override
    235     public void onSilence() {
    236         super.onSilence();
    237 
    238         if (mInvokeCounterMap.get(ON_SILENCE) != null) {
    239             mInvokeCounterMap.get(ON_SILENCE).invoke();
    240         }
    241     }
    242 
    243     public int getCurrentState()  {
    244         return mState;
    245     }
    246 
    247     public CallAudioState getCurrentCallAudioState() {
    248         return mCallAudioState;
    249     }
    250 
    251     public String getDtmfString() {
    252         return mDtmfString;
    253     }
    254 
    255     public InvokeCounter getInvokeCounter(int counterIndex) {
    256         if (mInvokeCounterMap.get(counterIndex) == null) {
    257             mInvokeCounterMap.put(counterIndex,
    258                     new InvokeCounter(getCounterLabel(counterIndex)));
    259         }
    260         return mInvokeCounterMap.get(counterIndex);
    261     }
    262 
    263     /**
    264      * Creates a mock video provider for this connection.
    265      */
    266     public void createMockVideoProvider() {
    267         final MockVideoProvider mockVideoProvider = new MockVideoProvider(this);
    268         mMockVideoProvider = mockVideoProvider;
    269         setVideoProvider(mockVideoProvider);
    270     }
    271 
    272     public void sendMockVideoQuality(int videoQuality) {
    273         if (mMockVideoProvider == null) {
    274             return;
    275         }
    276         mMockVideoProvider.sendMockVideoQuality(videoQuality);
    277     }
    278 
    279     public void sendMockCallSessionEvent(int event) {
    280         if (mMockVideoProvider == null) {
    281             return;
    282         }
    283         mMockVideoProvider.sendMockCallSessionEvent(event);
    284     }
    285 
    286     public void sendMockPeerWidth(int width) {
    287         if (mMockVideoProvider == null) {
    288             return;
    289         }
    290         mMockVideoProvider.sendMockPeerWidth(width);
    291     }
    292 
    293     public void sendMockSessionModifyRequest(VideoProfile request) {
    294         if (mMockVideoProvider == null) {
    295             return;
    296         }
    297         mMockVideoProvider.sendMockSessionModifyRequest(request);
    298     }
    299 
    300     public MockVideoProvider getMockVideoProvider() {
    301         return mMockVideoProvider;
    302     }
    303 
    304     public void setPhoneAccountHandle(PhoneAccountHandle handle)  {
    305         mPhoneAccountHandle = handle;
    306     }
    307 
    308     public PhoneAccountHandle getPhoneAccountHandle()  {
    309         return mPhoneAccountHandle;
    310     }
    311 
    312     public void setRemoteConnection(RemoteConnection remoteConnection)  {
    313         mRemoteConnection = remoteConnection;
    314     }
    315 
    316     public RemoteConnection getRemoteConnection()  {
    317         return mRemoteConnection;
    318     }
    319 
    320     public void setRttTextStream(RttTextStream rttTextStream) {
    321         mRttTextStream = rttTextStream;
    322     }
    323 
    324     public RttTextStream getRttTextStream() {
    325         return mRttTextStream;
    326     }
    327 
    328     private static String getCounterLabel(int counterIndex) {
    329         switch (counterIndex) {
    330             case ON_POST_DIAL_WAIT:
    331                 return "onPostDialWait";
    332             case ON_CALL_EVENT:
    333                 return "onCallEvent";
    334             case ON_PULL_EXTERNAL_CALL:
    335                 return "onPullExternalCall";
    336             case ON_EXTRAS_CHANGED:
    337                 return "onExtrasChanged";
    338             case ON_START_RTT:
    339                 return "onStartRtt";
    340             case ON_RTT_REQUEST_RESPONSE:
    341                 return "onRttRequestResponse";
    342             case ON_STOP_RTT:
    343                 return "onStopRtt";
    344             case ON_DEFLECT:
    345                 return "onDeflect";
    346             case ON_SILENCE:
    347                 return "onSilence";
    348             default:
    349                 return "Callback";
    350         }
    351     }
    352 }
    353