/*
 * Copyright (C) 2014 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.telecom;

import android.os.Bundle;
import android.telecom.CallAudioState;
import android.telecom.ConnectionRequest;
import android.telecom.Logging.Session;
import android.telecom.PhoneAccountHandle;

import com.android.internal.telecom.IConnectionServiceAdapter;

/**
 * Internal remote interface for connection services.
 *
 * @see android.telecom.ConnectionService
 *
 * @hide
 */
oneway interface IConnectionService {
    void addConnectionServiceAdapter(in IConnectionServiceAdapter adapter,
    in Session.Info sessionInfo);

    void removeConnectionServiceAdapter(in IConnectionServiceAdapter adapter,
    in Session.Info sessionInfo);

    void createConnection(
            in PhoneAccountHandle connectionManagerPhoneAccount,
            String callId,
            in ConnectionRequest request,
            boolean isIncoming,
            boolean isUnknown,
            in Session.Info sessionInfo);

    void createConnectionFailed(String callId, in ConnectionRequest request, boolean isIncoming,
            in Session.Info sessionInfo);

    void abort(String callId, in Session.Info sessionInfo);

    void answerVideo(String callId, int videoState, in Session.Info sessionInfo);

    void answer(String callId, in Session.Info sessionInfo);

    void reject(String callId, in Session.Info sessionInfo);

    void rejectWithMessage(String callId, String message, in Session.Info sessionInfo);

    void disconnect(String callId, in Session.Info sessionInfo);

    void silence(String callId, in Session.Info sessionInfo);

    void hold(String callId, in Session.Info sessionInfo);

    void unhold(String callId, in Session.Info sessionInfo);

    void onCallAudioStateChanged(String activeCallId, in CallAudioState callAudioState,
    in Session.Info sessionInfo);

    void playDtmfTone(String callId, char digit, in Session.Info sessionInfo);

    void stopDtmfTone(String callId, in Session.Info sessionInfo);

    void conference(String conferenceCallId, String callId, in Session.Info sessionInfo);

    void splitFromConference(String callId, in Session.Info sessionInfo);

    void mergeConference(String conferenceCallId, in Session.Info sessionInfo);

    void swapConference(String conferenceCallId, in Session.Info sessionInfo);

    void onPostDialContinue(String callId, boolean proceed, in Session.Info sessionInfo);

    void pullExternalCall(String callId, in Session.Info sessionInfo);

    void sendCallEvent(String callId, String event, in Bundle extras, in Session.Info sessionInfo);

    void onExtrasChanged(String callId, in Bundle extras, in Session.Info sessionInfo);
}
