/* * Copyright (C) 2020 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.ims; import android.annotation.NonNull; import android.annotation.Nullable; import android.os.IBinder; import android.os.Parcel; import android.os.Parcelable; import android.telephony.ims.ImsService; import android.telephony.ims.aidl.IImsConfig; import android.telephony.ims.aidl.IImsRegistration; import android.telephony.ims.aidl.ISipTransport; import android.telephony.ims.feature.ImsFeature; import java.util.Objects; /** * Contains an IBinder linking to the appropriate ImsFeature as well as the associated * interfaces. * @hide */ public final class ImsFeatureContainer implements Parcelable { /** * ImsFeature that is being tracked. */ public final IBinder imsFeature; /** * IImsConfig interface that should be associated with the ImsFeature. */ public final android.telephony.ims.aidl.IImsConfig imsConfig; /** * IImsRegistration interface that should be associated with this ImsFeature. */ public final IImsRegistration imsRegistration; /** * An optional interface containing the SIP transport implementation from the ImsService. */ public final ISipTransport sipTransport; /** * State of the feature that is being tracked. */ private @ImsFeature.ImsState int mState = ImsFeature.STATE_UNAVAILABLE; /** * Capabilities of this ImsService. */ private @ImsService.ImsServiceCapability long mCapabilities; /** * Contains the ImsFeature IBinder as well as the ImsService interfaces associated with * that feature. * @param iFace IBinder connection to the ImsFeature. * @param iConfig IImsConfig interface associated with the ImsFeature. * @param iReg IImsRegistration interface associated with the ImsFeature * @param initialCaps The initial capabilities that the ImsService supports. */ public ImsFeatureContainer(@NonNull IBinder iFace, @NonNull IImsConfig iConfig, @NonNull IImsRegistration iReg, @Nullable ISipTransport transport, long initialCaps) { imsFeature = iFace; imsConfig = iConfig; imsRegistration = iReg; sipTransport = transport; mCapabilities = initialCaps; } /** * Create an ImsFeatureContainer from a Parcel. */ private ImsFeatureContainer(Parcel in) { imsFeature = in.readStrongBinder(); imsConfig = IImsConfig.Stub.asInterface(in.readStrongBinder()); imsRegistration = IImsRegistration.Stub.asInterface(in.readStrongBinder()); sipTransport = ISipTransport.Stub.asInterface(in.readStrongBinder()); mState = in.readInt(); mCapabilities = in.readLong(); } /** * @return the capabilties that are associated with the ImsService that this ImsFeature * belongs to. */ public @ImsService.ImsServiceCapability long getCapabilities() { return mCapabilities; } /** * Update the capabilities that are associated with the ImsService that this ImsFeature * belongs to. */ public void setCapabilities(@ImsService.ImsServiceCapability long caps) { mCapabilities = caps; } /** * @return The state of the ImsFeature. */ public @ImsFeature.ImsState int getState() { return mState; } /** * Set the state that is associated with the ImsService that this ImsFeature * belongs to. */ public void setState(@ImsFeature.ImsState int state) { mState = state; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; ImsFeatureContainer that = (ImsFeatureContainer) o; return imsFeature.equals(that.imsFeature) && imsConfig.equals(that.imsConfig) && imsRegistration.equals(that.imsRegistration) && sipTransport.equals(that.sipTransport) && mState == that.getState() && mCapabilities == that.getCapabilities(); } @Override public int hashCode() { return Objects.hash(imsFeature, imsConfig, imsRegistration, sipTransport, mState, mCapabilities); } @Override public String toString() { return "FeatureContainer{" + "imsFeature=" + imsFeature + ", imsConfig=" + imsConfig + ", imsRegistration=" + imsRegistration + ", sipTransport=" + sipTransport + ", state=" + ImsFeature.STATE_LOG_MAP.get(mState) + ", capabilities = " + ImsService.getCapabilitiesString(mCapabilities) + '}'; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeStrongBinder(imsFeature); dest.writeStrongInterface(imsConfig); dest.writeStrongInterface(imsRegistration); dest.writeStrongInterface(sipTransport); dest.writeInt(mState); dest.writeLong(mCapabilities); } public static final Creator CREATOR = new Creator() { @Override public ImsFeatureContainer createFromParcel(Parcel source) { return new ImsFeatureContainer(source); } @Override public ImsFeatureContainer[] newArray(int size) { return new ImsFeatureContainer[size]; } }; }