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.os.Bundle;
     22 import android.telecom.CallAudioState;
     23 import android.telecom.Connection;
     24 import android.telecom.DisconnectCause;
     25 import android.telecom.PhoneAccountHandle;
     26 import android.telecom.RemoteConnection;
     27 import android.telecom.VideoProfile;
     28 import android.telecom.cts.TestUtils.InvokeCounter;
     29 import android.util.SparseArray;
     30 
     31 /**
     32  * {@link Connection} subclass that immediately performs any state changes that are a result of
     33  * callbacks sent from Telecom.
     34  */
     35 public class MockConnection extends Connection {
     36     public static final int ON_POST_DIAL_WAIT = 1;
     37     public static final int ON_CALL_EVENT = 2;
     38     public static final int ON_PULL_EXTERNAL_CALL = 3;
     39     public static final int ON_EXTRAS_CHANGED = 4;
     40 
     41     private CallAudioState mCallAudioState =
     42             new CallAudioState(false, CallAudioState.ROUTE_EARPIECE, ROUTE_EARPIECE | ROUTE_SPEAKER);
     43     private int mState = STATE_NEW;
     44     public int videoState = VideoProfile.STATE_AUDIO_ONLY;
     45     private String mDtmfString = "";
     46     private MockVideoProvider mMockVideoProvider;
     47     private PhoneAccountHandle mPhoneAccountHandle;
     48     private RemoteConnection mRemoteConnection = null;
     49 
     50     private SparseArray<InvokeCounter> mInvokeCounterMap = new SparseArray<>(10);
     51 
     52     @Override
     53     public void onAnswer() {
     54         super.onAnswer();
     55     }
     56 
     57     @Override
     58     public void onAnswer(int videoState) {
     59         super.onAnswer(videoState);
     60         this.videoState = videoState;
     61         setActive();
     62         if (mRemoteConnection != null) {
     63             mRemoteConnection.answer();
     64         }
     65     }
     66 
     67     @Override
     68     public void onReject() {
     69         super.onReject();
     70         setDisconnected(new DisconnectCause(DisconnectCause.REJECTED));
     71         if (mRemoteConnection != null) {
     72             mRemoteConnection.reject();
     73         }
     74         destroy();
     75     }
     76 
     77     @Override
     78     public void onReject(String reason) {
     79         super.onReject();
     80         setDisconnected(new DisconnectCause(DisconnectCause.REJECTED, reason));
     81         if (mRemoteConnection != null) {
     82             mRemoteConnection.reject();
     83         }
     84         destroy();
     85     }
     86 
     87     @Override
     88     public void onHold() {
     89         super.onHold();
     90         setOnHold();
     91         if (mRemoteConnection != null) {
     92             mRemoteConnection.hold();
     93         }
     94     }
     95 
     96     @Override
     97     public void onUnhold() {
     98         super.onUnhold();
     99         setActive();
    100         if (mRemoteConnection != null) {
    101             mRemoteConnection.unhold();
    102         }
    103     }
    104 
    105     @Override
    106     public void onDisconnect() {
    107         super.onDisconnect();
    108         setDisconnected(new DisconnectCause(DisconnectCause.LOCAL));
    109         if (mRemoteConnection != null) {
    110             mRemoteConnection.disconnect();
    111         }
    112         destroy();
    113     }
    114 
    115     @Override
    116     public void onAbort() {
    117         super.onAbort();
    118         setDisconnected(new DisconnectCause(DisconnectCause.UNKNOWN));
    119         if (mRemoteConnection != null) {
    120             mRemoteConnection.abort();
    121         }
    122         destroy();
    123     }
    124 
    125     @Override
    126     public void onPlayDtmfTone(char c) {
    127         super.onPlayDtmfTone(c);
    128         mDtmfString += c;
    129         if (mRemoteConnection != null) {
    130             mRemoteConnection.playDtmfTone(c);
    131         }
    132     }
    133 
    134     @Override
    135     public void onStopDtmfTone() {
    136         super.onStopDtmfTone();
    137         mDtmfString += ".";
    138         if (mRemoteConnection != null) {
    139             mRemoteConnection.stopDtmfTone();
    140         }
    141     }
    142 
    143     @Override
    144     public void onCallAudioStateChanged(CallAudioState state) {
    145         super.onCallAudioStateChanged(state);
    146         mCallAudioState = state;
    147         if (mRemoteConnection != null) {
    148             mRemoteConnection.setCallAudioState(state);
    149         }
    150     }
    151 
    152     @Override
    153     public void onStateChanged(int state) {
    154         super.onStateChanged(state);
    155         mState = state;
    156     }
    157 
    158     @Override
    159     public void onPostDialContinue(boolean proceed) {
    160         super.onPostDialContinue(proceed);
    161         if (mInvokeCounterMap.get(ON_POST_DIAL_WAIT) != null) {
    162             mInvokeCounterMap.get(ON_POST_DIAL_WAIT).invoke(proceed);
    163         }
    164     }
    165 
    166     @Override
    167     public void onCallEvent(String event, Bundle extras) {
    168         super.onCallEvent(event, extras);
    169         if (mInvokeCounterMap.get(ON_CALL_EVENT) != null) {
    170             mInvokeCounterMap.get(ON_CALL_EVENT).invoke(event, extras);
    171         }
    172     }
    173 
    174     @Override
    175     public void onPullExternalCall() {
    176         super.onPullExternalCall();
    177         if (mInvokeCounterMap.get(ON_PULL_EXTERNAL_CALL) != null) {
    178             mInvokeCounterMap.get(ON_PULL_EXTERNAL_CALL).invoke();
    179         }
    180     }
    181 
    182     @Override
    183     public void onExtrasChanged(Bundle extras) {
    184         super.onExtrasChanged(extras);
    185         if (mInvokeCounterMap.get(ON_EXTRAS_CHANGED) != null) {
    186             mInvokeCounterMap.get(ON_EXTRAS_CHANGED).invoke(extras);
    187         }
    188     }
    189 
    190     public int getCurrentState()  {
    191         return mState;
    192     }
    193 
    194     public CallAudioState getCurrentCallAudioState() {
    195         return mCallAudioState;
    196     }
    197 
    198     public String getDtmfString() {
    199         return mDtmfString;
    200     }
    201 
    202     public InvokeCounter getInvokeCounter(int counterIndex) {
    203         if (mInvokeCounterMap.get(counterIndex) == null) {
    204             mInvokeCounterMap.put(counterIndex,
    205                     new InvokeCounter(getCounterLabel(counterIndex)));
    206         }
    207         return mInvokeCounterMap.get(counterIndex);
    208     }
    209 
    210     /**
    211      * Creates a mock video provider for this connection.
    212      */
    213     public void createMockVideoProvider() {
    214         final MockVideoProvider mockVideoProvider = new MockVideoProvider(this);
    215         mMockVideoProvider = mockVideoProvider;
    216         setVideoProvider(mockVideoProvider);
    217     }
    218 
    219     public void sendMockVideoQuality(int videoQuality) {
    220         if (mMockVideoProvider == null) {
    221             return;
    222         }
    223         mMockVideoProvider.sendMockVideoQuality(videoQuality);
    224     }
    225 
    226     public void sendMockCallSessionEvent(int event) {
    227         if (mMockVideoProvider == null) {
    228             return;
    229         }
    230         mMockVideoProvider.sendMockCallSessionEvent(event);
    231     }
    232 
    233     public void sendMockPeerWidth(int width) {
    234         if (mMockVideoProvider == null) {
    235             return;
    236         }
    237         mMockVideoProvider.sendMockPeerWidth(width);
    238     }
    239 
    240     public void sendMockSessionModifyRequest(VideoProfile request) {
    241         if (mMockVideoProvider == null) {
    242             return;
    243         }
    244         mMockVideoProvider.sendMockSessionModifyRequest(request);
    245     }
    246 
    247     public MockVideoProvider getMockVideoProvider() {
    248         return mMockVideoProvider;
    249     }
    250 
    251     public void setPhoneAccountHandle(PhoneAccountHandle handle)  {
    252         mPhoneAccountHandle = handle;
    253     }
    254 
    255     public PhoneAccountHandle getPhoneAccountHandle()  {
    256         return mPhoneAccountHandle;
    257     }
    258 
    259     public void setRemoteConnection(RemoteConnection remoteConnection)  {
    260         mRemoteConnection = remoteConnection;
    261     }
    262 
    263     public RemoteConnection getRemoteConnection()  {
    264         return mRemoteConnection;
    265     }
    266 
    267     private static String getCounterLabel(int counterIndex) {
    268         switch (counterIndex) {
    269             case ON_POST_DIAL_WAIT:
    270                 return "onPostDialWait";
    271             case ON_CALL_EVENT:
    272                 return "onCallEvent";
    273             case ON_PULL_EXTERNAL_CALL:
    274                 return "onPullExternalCall";
    275             case ON_EXTRAS_CHANGED:
    276                 return "onExtrasChanged";
    277             default:
    278                 return "Callback";
    279         }
    280     }
    281 }
    282