blob: 187037226c8e904183bf251231203d2bc7f93ee4 [file] [log] [blame]
//
// 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.
#pragma once
#include "host/commands/modem_simulator/modem_service.h"
#include "host/commands/modem_simulator/network_service.h"
#include "host/commands/modem_simulator/sim_service.h"
namespace cuttlefish {
class CallService : public ModemService, public std::enable_shared_from_this<CallService> {
public:
CallService(int32_t service_id, ChannelMonitor* channel_monitor,
ThreadLooper* thread_looper);
~CallService() = default;
CallService(const CallService &) = delete;
CallService &operator=(const CallService &) = delete;
void SetupDependency(SimService* sim, NetworkService* net);
void HandleDial(const Client& client, const std::string& command);
void HandleAcceptCall(const Client& client);
void HandleRejectCall(const Client& client);
void HandleCurrentCalls(const Client& client);
void HandleHangup(const Client& client, const std::string& command);
void HandleMute(const Client& client, const std::string& command);
void HandleSendDtmf(const Client& client, const std::string& command);
void HandleCancelUssd(const Client& client, const std::string& command);
void HandleEmergencyMode(const Client& client, const std::string& command);
void HandleRemoteCall(const Client& client, const std::string& command);
private:
void InitializeServiceState();
std::vector<CommandHandler> InitializeCommandHandlers();
void SimulatePendingCallsAnswered();
void CallStateUpdate();
struct CallStatus {
enum CallState {
CALL_STATE_ACTIVE = 0,
CALL_STATE_HELD,
CALL_STATE_DIALING,
CALL_STATE_ALERTING,
CALL_STATE_INCOMING,
CALL_STATE_WAITING,
CALL_STATE_HANGUP
};
// ctors
CallStatus()
: call_state(CALL_STATE_ACTIVE),
is_mobile_terminated(true),
is_international(false),
is_voice_mode(true),
is_multi_party(false),
can_present_number(true) {}
CallStatus(const std::string_view number)
: call_state(CALL_STATE_INCOMING),
is_mobile_terminated(true),
is_international(false),
is_voice_mode(true),
is_multi_party(false),
number(number),
can_present_number(true) {}
bool isCallBackground() {
return call_state == CALL_STATE_HELD;
}
bool isCallActive() {
return call_state == CALL_STATE_ACTIVE;
}
bool isCallDialing() {
return call_state == CALL_STATE_DIALING;
}
bool isCallIncoming() {
return call_state == CALL_STATE_INCOMING;
}
bool isCallWaiting() {
return call_state == CALL_STATE_WAITING;
}
bool isCallAlerting() {
return call_state == CALL_STATE_ALERTING;
}
bool SetCallBackground() {
if (call_state == CALL_STATE_ACTIVE) {
call_state = CALL_STATE_HELD;
return true;
}
return false;
}
bool SetCallActive() {
if (call_state == CALL_STATE_INCOMING || call_state == CALL_STATE_WAITING ||
call_state == CALL_STATE_DIALING || call_state == CALL_STATE_HELD) {
call_state = CALL_STATE_ACTIVE;
return true;
}
return false;
}
// date member public
CallState call_state;
bool is_mobile_terminated;
bool is_international;
bool is_voice_mode;
bool is_multi_party;
bool is_remote_call;
std::optional<cuttlefish::SharedFD> remote_client;
std::optional<int32_t> timeout_serial;
std::string number;
bool can_present_number;
};
using CallToken = std::pair<int, std::string>;
void SendCallStatusToRemote(CallStatus& call, CallStatus::CallState state);
void TimerWaitingRemoteCallResponse(CallToken token);
// private data members
SimService* sim_service_;
NetworkService* network_service_;
int32_t last_active_call_index_;
std::map<int, CallStatus> active_calls_;
bool in_emergency_mode_;
bool mute_on_;
};
} // namespace