diff options
author | Treehugger Robot <treehugger-gerrit@google.com> | 2017-08-31 16:17:04 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2017-08-31 16:17:04 +0000 |
commit | c39ea3c55fac807c0b98aabdf56c70dc8a49036c (patch) | |
tree | e282668a9587cf6c1ec7b604dea860400c75c6c7 /java/com/android/dialer/simulator/impl/SimulatorConnectionService.java | |
parent | 68038172793ee0e2ab3e2e56ddfbeb82879d1f58 (diff) | |
parent | 2ca4318cc1ee57dda907ba2069bd61d162b1baef (diff) |
Merge "Update Dialer source to latest internal Google revision."
Diffstat (limited to 'java/com/android/dialer/simulator/impl/SimulatorConnectionService.java')
-rw-r--r-- | java/com/android/dialer/simulator/impl/SimulatorConnectionService.java | 108 |
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); + } } |