summaryrefslogtreecommitdiff
path: root/java/com/android/dialer/simulator/impl/SimulatorVoiceCall.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/com/android/dialer/simulator/impl/SimulatorVoiceCall.java')
-rw-r--r--java/com/android/dialer/simulator/impl/SimulatorVoiceCall.java103
1 files changed, 94 insertions, 9 deletions
diff --git a/java/com/android/dialer/simulator/impl/SimulatorVoiceCall.java b/java/com/android/dialer/simulator/impl/SimulatorVoiceCall.java
index 2512828b8..8eefb48d9 100644
--- a/java/com/android/dialer/simulator/impl/SimulatorVoiceCall.java
+++ b/java/com/android/dialer/simulator/impl/SimulatorVoiceCall.java
@@ -17,18 +17,103 @@
package com.android.dialer.simulator.impl;
import android.content.Context;
-import android.os.Bundle;
import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.telecom.Connection;
+import android.telecom.DisconnectCause;
+import android.view.ActionProvider;
+import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
+import com.android.dialer.common.concurrent.ThreadUtil;
+import com.android.dialer.simulator.Simulator.Event;
-/** Utilities to simulate phone calls. */
-final class SimulatorVoiceCall {
- static void addNewIncomingCall(@NonNull Context context) {
- LogUtil.enterBlock("SimulatorVoiceCall.addNewIncomingCall");
- // Set the caller ID to the Google London office.
- String callerId = "+44 (0) 20 7031 3000";
- SimulatorConnectionService.addNewIncomingCall(context, new Bundle(), callerId);
+/** Entry point in the simulator to create voice calls. */
+final class SimulatorVoiceCall
+ implements SimulatorConnectionService.Listener, SimulatorConnection.Listener {
+ @NonNull private final Context context;
+ @Nullable private String connectionTag;
+
+ static ActionProvider getActionProvider(@NonNull Context context) {
+ return new SimulatorSubMenu(context)
+ .addItem("Incoming call", () -> new SimulatorVoiceCall(context).addNewIncomingCall(false))
+ .addItem("Outgoing call", () -> new SimulatorVoiceCall(context).addNewOutgoingCall())
+ .addItem("Spam call", () -> new SimulatorVoiceCall(context).addNewIncomingCall(true));
+ }
+
+ private SimulatorVoiceCall(@NonNull Context context) {
+ this.context = Assert.isNotNull(context);
+ SimulatorConnectionService.addListener(this);
+ }
+
+ private void addNewIncomingCall(boolean isSpam) {
+ String callerId =
+ isSpam
+ ? "+1-661-778-3020" /* Blacklisted custom spam number */
+ : "+44 (0) 20 7031 3000" /* Google London office */;
+ connectionTag =
+ SimulatorSimCallManager.addNewIncomingCall(context, callerId, false /* isVideo */);
+ }
+
+ private void addNewOutgoingCall() {
+ String callerId = "+55-31-2128-6800"; // Brazil office.
+ connectionTag =
+ SimulatorSimCallManager.addNewOutgoingCall(context, callerId, false /* isVideo */);
}
- private SimulatorVoiceCall() {}
+ @Override
+ public void onNewOutgoingConnection(@NonNull SimulatorConnection connection) {
+ if (connection.getExtras().getBoolean(connectionTag)) {
+ LogUtil.i("SimulatorVoiceCall.onNewOutgoingConnection", "connection created");
+ handleNewConnection(connection);
+ connection.setActive();
+ }
+ }
+
+ @Override
+ public void onNewIncomingConnection(@NonNull SimulatorConnection connection) {
+ if (connection.getExtras().getBoolean(connectionTag)) {
+ LogUtil.i("SimulatorVoiceCall.onNewIncomingConnection", "connection created");
+ handleNewConnection(connection);
+ }
+ }
+
+ private void handleNewConnection(@NonNull SimulatorConnection connection) {
+ connection.addListener(this);
+ connection.setConnectionCapabilities(
+ connection.getConnectionCapabilities()
+ | Connection.CAPABILITY_SUPPORTS_VT_LOCAL_BIDIRECTIONAL
+ | Connection.CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL);
+ }
+
+ @Override
+ public void onEvent(@NonNull SimulatorConnection connection, @NonNull Event event) {
+ switch (event.type) {
+ case Event.NONE:
+ throw Assert.createIllegalStateFailException();
+ case Event.ANSWER:
+ connection.setActive();
+ break;
+ case Event.REJECT:
+ connection.setDisconnected(new DisconnectCause(DisconnectCause.REJECTED));
+ break;
+ case Event.HOLD:
+ connection.setOnHold();
+ break;
+ case Event.UNHOLD:
+ connection.setActive();
+ break;
+ case Event.DISCONNECT:
+ connection.setDisconnected(new DisconnectCause(DisconnectCause.LOCAL));
+ break;
+ case Event.STATE_CHANGE:
+ break;
+ case Event.DTMF:
+ break;
+ case Event.SESSION_MODIFY_REQUEST:
+ ThreadUtil.postDelayedOnUiThread(() -> connection.handleSessionModifyRequest(event), 2000);
+ break;
+ default:
+ throw Assert.createIllegalStateFailException();
+ }
+ }
}