| /* |
| * Copyright (C) 2022 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.internal.telephony.imsphone; |
| |
| import android.annotation.NonNull; |
| import android.annotation.Nullable; |
| import android.telephony.AccessNetworkConstants; |
| import android.telephony.ServiceState; |
| |
| import com.android.internal.telephony.Call; |
| |
| /** |
| * Contains call state to be notified to modem. |
| */ |
| public class ImsCallInfo { |
| |
| private final int mIndex; |
| private @Nullable ImsPhoneConnection mConnection = null; |
| private Call.State mState = Call.State.IDLE; |
| private boolean mIsHeldByRemote = false; |
| |
| public ImsCallInfo(int index) { |
| mIndex = index; |
| } |
| |
| /** Clears the call state. */ |
| public void reset() { |
| mConnection = null; |
| mState = Call.State.IDLE; |
| mIsHeldByRemote = false; |
| } |
| |
| /** |
| * Updates the state of the IMS call. |
| * |
| * @param c The instance of {@link ImsPhoneConnection}. |
| */ |
| public void update(@NonNull ImsPhoneConnection c) { |
| mConnection = c; |
| mState = c.getState(); |
| } |
| |
| /** |
| * Updates the state of the IMS call. |
| * |
| * @param c The instance of {@link ImsPhoneConnection}. |
| * @param holdReceived {@code true} if the remote party held the call. |
| * @param resumeReceived {@code true} if the remote party resumed the call. |
| */ |
| public boolean update(@NonNull ImsPhoneConnection c, |
| boolean holdReceived, boolean resumeReceived) { |
| Call.State state = c.getState(); |
| boolean changed = mState != state; |
| mState = state; |
| |
| if (holdReceived && !mIsHeldByRemote) { |
| changed = true; |
| mIsHeldByRemote = true; |
| } else if (resumeReceived && mIsHeldByRemote) { |
| changed = true; |
| mIsHeldByRemote = false; |
| } |
| |
| return changed; |
| } |
| |
| /** Called when clearing orphaned connection. */ |
| public void onDisconnect() { |
| mState = Call.State.DISCONNECTED; |
| } |
| |
| /** @return the call index. */ |
| public int getIndex() { |
| return mIndex; |
| } |
| |
| /** @return the call state. */ |
| public Call.State getCallState() { |
| return mState; |
| } |
| |
| /** @return whether the remote party is holding the call. */ |
| public boolean isHeldByRemote() { |
| return mIsHeldByRemote; |
| } |
| |
| /** @return {@code true} if the call is an incoming call. */ |
| public boolean isIncoming() { |
| return mConnection.isIncoming(); |
| } |
| |
| /** @return {@code true} if the call is an emergency call. */ |
| public boolean isEmergencyCall() { |
| return mConnection.isEmergencyCall(); |
| } |
| |
| /** @return the radio technology used for current connection. */ |
| public @AccessNetworkConstants.RadioAccessNetworkType int getCallRadioTech() { |
| return ServiceState.rilRadioTechnologyToAccessNetworkType(mConnection.getCallRadioTech()); |
| } |
| |
| @Override |
| public String toString() { |
| return "[ id=" + mIndex + ", state=" + mState |
| + ", isMT=" + isIncoming() + ", heldByRemote=" + mIsHeldByRemote + " ]"; |
| } |
| } |