summaryrefslogtreecommitdiff
path: root/java/com/android/dialer/simulator/impl/SimulatorConnectionService.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/com/android/dialer/simulator/impl/SimulatorConnectionService.java')
-rw-r--r--java/com/android/dialer/simulator/impl/SimulatorConnectionService.java108
1 files changed, 101 insertions, 7 deletions
diff --git a/java/com/android/dialer/simulator/impl/SimulatorConnectionService.java b/java/com/android/dialer/simulator/impl/SimulatorConnectionService.java
index 322360786..9e107edee 100644
--- a/java/com/android/dialer/simulator/impl/SimulatorConnectionService.java
+++ b/java/com/android/dialer/simulator/impl/SimulatorConnectionService.java
@@ -19,6 +19,8 @@ package com.android.dialer.simulator.impl;
import android.content.ComponentName;
import android.content.Context;
import android.net.Uri;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
import android.telecom.Connection;
import android.telecom.ConnectionRequest;
import android.telecom.ConnectionService;
@@ -26,20 +28,64 @@ import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
import android.telecom.TelecomManager;
import android.telephony.TelephonyManager;
+import android.widget.Toast;
+import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
import java.util.ArrayList;
import java.util.List;
/** Simple connection provider to create an incoming call. This is useful for emulators. */
-public final class SimulatorConnectionService extends ConnectionService {
+public class SimulatorConnectionService extends ConnectionService {
private static final String PHONE_ACCOUNT_ID = "SIMULATOR_ACCOUNT_ID";
+ private static final String EXTRA_IS_SIMULATOR_CONNECTION = "is_simulator_connection";
+ private static final List<Listener> listeners = new ArrayList<>();
- public static void register(Context context) {
+ private static void register(@NonNull Context context) {
LogUtil.enterBlock("SimulatorConnectionService.register");
+ Assert.isNotNull(context);
context.getSystemService(TelecomManager.class).registerPhoneAccount(buildPhoneAccount(context));
}
+ private static void unregister(@NonNull Context context) {
+ LogUtil.enterBlock("SimulatorConnectionService.unregister");
+ Assert.isNotNull(context);
+ context
+ .getSystemService(TelecomManager.class)
+ .unregisterPhoneAccount(buildPhoneAccount(context).getAccountHandle());
+ }
+
+ public static void addNewIncomingCall(
+ @NonNull Context context, @NonNull Bundle extras, @NonNull String callerId) {
+ LogUtil.enterBlock("SimulatorConnectionService.addNewIncomingCall");
+ Assert.isNotNull(context);
+ Assert.isNotNull(extras);
+ Assert.isNotNull(callerId);
+
+ register(context);
+
+ Bundle bundle = new Bundle(extras);
+ bundle.putString(TelephonyManager.EXTRA_INCOMING_NUMBER, callerId);
+ bundle.putBoolean(EXTRA_IS_SIMULATOR_CONNECTION, true);
+
+ // Use the system's phone account so that these look like regular SIM call.
+ TelecomManager telecomManager = context.getSystemService(TelecomManager.class);
+ PhoneAccountHandle systemPhoneAccount =
+ telecomManager.getDefaultOutgoingPhoneAccount(PhoneAccount.SCHEME_TEL);
+ telecomManager.addNewIncomingCall(systemPhoneAccount, bundle);
+ }
+
+ public static void addListener(@NonNull Listener listener) {
+ Assert.isNotNull(listener);
+ listeners.add(listener);
+ }
+
+ public static void removeListener(@NonNull Listener listener) {
+ Assert.isNotNull(listener);
+ listeners.remove(listener);
+ }
+
+ @NonNull
private static PhoneAccount buildPhoneAccount(Context context) {
PhoneAccount.Builder builder =
new PhoneAccount.Builder(
@@ -48,7 +94,8 @@ public final class SimulatorConnectionService extends ConnectionService {
uriSchemes.add(PhoneAccount.SCHEME_TEL);
return builder
- .setCapabilities(PhoneAccount.CAPABILITY_CALL_PROVIDER)
+ .setCapabilities(
+ PhoneAccount.CAPABILITY_CALL_PROVIDER | PhoneAccount.CAPABILITY_CONNECTION_MANAGER)
.setShortDescription("Simulator Connection Service")
.setSupportedUriSchemes(uriSchemes)
.build();
@@ -67,21 +114,68 @@ public final class SimulatorConnectionService extends ConnectionService {
@Override
public Connection onCreateOutgoingConnection(
PhoneAccountHandle phoneAccount, ConnectionRequest request) {
- LogUtil.i(
- "SimulatorConnectionService.onCreateOutgoingConnection",
- "outgoing calls not supported yet");
- return null;
+ LogUtil.enterBlock("SimulatorConnectionService.onCreateOutgoingConnection");
+ if (!isSimulatorConnectionRequest(request)) {
+ LogUtil.i(
+ "SimulatorConnectionService.onCreateOutgoingConnection",
+ "outgoing call not from simulator, unregistering");
+ Toast.makeText(
+ this, "Unregistering Dialer simulator, making a real phone call", Toast.LENGTH_LONG)
+ .show();
+ unregister(this);
+ return null;
+ }
+
+ SimulatorConnection connection = new SimulatorConnection();
+ connection.setActive();
+ connection.setAddress(request.getAddress(), TelecomManager.PRESENTATION_ALLOWED);
+ connection.setConnectionCapabilities(
+ Connection.CAPABILITY_MUTE | Connection.CAPABILITY_SUPPORT_HOLD);
+ connection.putExtras(request.getExtras());
+
+ for (Listener listener : listeners) {
+ listener.onNewOutgoingConnection(connection);
+ }
+ return connection;
}
@Override
public Connection onCreateIncomingConnection(
PhoneAccountHandle phoneAccount, ConnectionRequest request) {
LogUtil.enterBlock("SimulatorConnectionService.onCreateIncomingConnection");
+ if (!isSimulatorConnectionRequest(request)) {
+ LogUtil.i(
+ "SimulatorConnectionService.onCreateIncomingConnection",
+ "incoming call not from simulator, unregistering");
+ Toast.makeText(
+ this, "Unregistering Dialer simulator, got a real incoming call", Toast.LENGTH_LONG)
+ .show();
+ unregister(this);
+ return null;
+ }
+
SimulatorConnection connection = new SimulatorConnection();
connection.setRinging();
connection.setAddress(getPhoneNumber(request), TelecomManager.PRESENTATION_ALLOWED);
connection.setConnectionCapabilities(
Connection.CAPABILITY_MUTE | Connection.CAPABILITY_SUPPORT_HOLD);
+ connection.putExtras(request.getExtras());
+
+ for (Listener listener : listeners) {
+ listener.onNewIncomingConnection(connection);
+ }
return connection;
}
+
+ private static boolean isSimulatorConnectionRequest(@NonNull ConnectionRequest request) {
+ return request.getExtras() != null
+ && request.getExtras().getBoolean(EXTRA_IS_SIMULATOR_CONNECTION);
+ }
+
+ /** Callback used to notify listeners when a new connection has been added. */
+ public interface Listener {
+ void onNewOutgoingConnection(SimulatorConnection connection);
+
+ void onNewIncomingConnection(SimulatorConnection connection);
+ }
}