/* * Copyright (C) 2021 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.server.telecom; import android.annotation.NonNull; import android.os.Binder; import android.os.RemoteException; import android.telecom.CallDiagnosticService; import android.telecom.CallDiagnostics; import android.telecom.Log; import com.android.internal.telecom.ICallDiagnosticServiceAdapter; /** * Adapter class used to provide a path for messages FROM a {@link CallDiagnosticService} back to * the telecom stack. */ public class CallDiagnosticServiceAdapter extends ICallDiagnosticServiceAdapter.Stub { public interface TelecomAdapter { void displayDiagnosticMessage(String callId, int messageId, CharSequence message); void clearDiagnosticMessage(String callId, int messageId); void sendDeviceToDeviceMessage(String callId, @CallDiagnostics.MessageType int message, int value); void overrideDisconnectMessage(String callId, CharSequence message); } private final TelecomAdapter mTelecomAdapter; private final String mOwnerPackageName; private final String mOwnerPackageAbbreviation; private final TelecomSystem.SyncRoot mLock; CallDiagnosticServiceAdapter(@NonNull TelecomAdapter telecomAdapter, @NonNull String ownerPackageName, @NonNull TelecomSystem.SyncRoot lock) { mTelecomAdapter = telecomAdapter; mOwnerPackageName = ownerPackageName; mOwnerPackageAbbreviation = Log.getPackageAbbreviation(ownerPackageName); mLock = lock; } @Override public void displayDiagnosticMessage(String callId, int messageId, CharSequence message) throws RemoteException { try { Log.startSession("CDSA.dDM", mOwnerPackageAbbreviation); long token = Binder.clearCallingIdentity(); try { synchronized (mLock) { Log.i(this, "displayDiagnosticMessage; callId=%s, msg=%d/%s", callId, messageId, message); mTelecomAdapter.displayDiagnosticMessage(callId, messageId, message); } } finally { Binder.restoreCallingIdentity(token); } } finally { Log.endSession(); } } @Override public void clearDiagnosticMessage(String callId, int messageId) throws RemoteException { try { Log.startSession("CDSA.cDM", mOwnerPackageAbbreviation); long token = Binder.clearCallingIdentity(); try { synchronized (mLock) { Log.i(this, "clearDiagnosticMessage; callId=%s, msg=%d", callId, messageId); mTelecomAdapter.clearDiagnosticMessage(callId, messageId); } } finally { Binder.restoreCallingIdentity(token); } } finally { Log.endSession(); } } @Override public void sendDeviceToDeviceMessage(String callId, @CallDiagnostics.MessageType int message, int value) throws RemoteException { try { Log.startSession("CDSA.sDTDM", mOwnerPackageAbbreviation); long token = Binder.clearCallingIdentity(); try { synchronized (mLock) { Log.i(this, "sendDeviceToDeviceMessage; callId=%s, msg=%d/%d", callId, message, value); mTelecomAdapter.sendDeviceToDeviceMessage(callId, message, value); } } finally { Binder.restoreCallingIdentity(token); } } finally { Log.endSession(); } } @Override public void overrideDisconnectMessage(String callId, CharSequence message) throws RemoteException { try { Log.startSession("CDSA.oDM", mOwnerPackageAbbreviation); long token = Binder.clearCallingIdentity(); try { synchronized (mLock) { Log.i(this, "overrideDisconnectMessage; callId=%s, msg=%s", callId, message); mTelecomAdapter.overrideDisconnectMessage(callId, message); } } finally { Binder.restoreCallingIdentity(token); } } finally { Log.endSession(); } } }