• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 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 com.android.server.telecom.voip;
18 
19 import static android.telecom.CallAttributes.CALL_CAPABILITIES_KEY;
20 import static android.telecom.CallAttributes.DISPLAY_NAME_KEY;
21 
22 import static com.android.server.telecom.voip.VideoStateTranslation.TransactionalVideoStateToVideoProfileState;
23 
24 import android.os.Bundle;
25 import android.telecom.CallAttributes;
26 import android.telecom.CallException;
27 import android.telecom.TelecomManager;
28 import android.util.Log;
29 
30 import com.android.internal.annotations.VisibleForTesting;
31 import com.android.server.telecom.Call;
32 import com.android.server.telecom.CallsManager;
33 import com.android.server.telecom.flags.FeatureFlags;
34 
35 import java.util.concurrent.CompletableFuture;
36 import java.util.concurrent.CompletionStage;
37 
38 public class IncomingCallTransaction extends VoipCallTransaction {
39 
40     private static final String TAG = IncomingCallTransaction.class.getSimpleName();
41     private final String mCallId;
42     private final CallAttributes mCallAttributes;
43     private final CallsManager mCallsManager;
44     private final Bundle mExtras;
45     private FeatureFlags mFeatureFlags;
46 
setFeatureFlags(FeatureFlags featureFlags)47     public void setFeatureFlags(FeatureFlags featureFlags) {
48         mFeatureFlags = featureFlags;
49     }
50 
IncomingCallTransaction(String callId, CallAttributes callAttributes, CallsManager callsManager, Bundle extras, FeatureFlags featureFlags)51     public IncomingCallTransaction(String callId, CallAttributes callAttributes,
52             CallsManager callsManager, Bundle extras, FeatureFlags featureFlags) {
53         super(callsManager.getLock());
54         mExtras = extras;
55         mCallId = callId;
56         mCallAttributes = callAttributes;
57         mCallsManager = callsManager;
58         mFeatureFlags = featureFlags;
59     }
60 
IncomingCallTransaction(String callId, CallAttributes callAttributes, CallsManager callsManager, FeatureFlags featureFlags)61     public IncomingCallTransaction(String callId, CallAttributes callAttributes,
62             CallsManager callsManager, FeatureFlags featureFlags) {
63         this(callId, callAttributes, callsManager, new Bundle(), featureFlags);
64     }
65 
66     @Override
processTransaction(Void v)67     public CompletionStage<VoipCallTransactionResult> processTransaction(Void v) {
68         Log.d(TAG, "processTransaction");
69 
70         if (mCallsManager.isIncomingCallPermitted(mCallAttributes.getPhoneAccountHandle())) {
71             Log.d(TAG, "processTransaction: incoming call permitted");
72 
73             Call call = mCallsManager.processIncomingCallIntent(
74                     mCallAttributes.getPhoneAccountHandle(),
75                     generateExtras(mCallAttributes), false);
76 
77             return CompletableFuture.completedFuture(
78                     new VoipCallTransactionResult(
79                             VoipCallTransactionResult.RESULT_SUCCEED, call, "success"));
80         } else {
81             Log.d(TAG, "processTransaction: incoming call is not permitted at this time");
82 
83             return CompletableFuture.completedFuture(
84                     new VoipCallTransactionResult(
85                             CallException.CODE_CALL_NOT_PERMITTED_AT_PRESENT_TIME,
86                             "incoming call not permitted at the current time"));
87         }
88     }
89 
90     @VisibleForTesting
generateExtras(CallAttributes callAttributes)91     public Bundle generateExtras(CallAttributes callAttributes) {
92         mExtras.putString(TelecomManager.TRANSACTION_CALL_ID_KEY, mCallId);
93         mExtras.putInt(CALL_CAPABILITIES_KEY, callAttributes.getCallCapabilities());
94         if (mFeatureFlags.transactionalVideoState()) {
95             // Transactional calls need to remap the CallAttributes video state to the existing
96             // VideoProfile for consistency.
97             mExtras.putInt(TelecomManager.EXTRA_INCOMING_VIDEO_STATE,
98                     TransactionalVideoStateToVideoProfileState(callAttributes.getCallType()));
99         } else {
100             mExtras.putInt(TelecomManager.EXTRA_INCOMING_VIDEO_STATE,
101                     callAttributes.getCallType());
102         }
103         mExtras.putCharSequence(DISPLAY_NAME_KEY, callAttributes.getDisplayName());
104         mExtras.putParcelable(TelecomManager.EXTRA_INCOMING_CALL_ADDRESS,
105                 callAttributes.getAddress());
106         return mExtras;
107     }
108 }
109