summaryrefslogtreecommitdiff
path: root/java/com/android/dialer/simulator
diff options
context:
space:
mode:
authorsail <sail@google.com>2017-08-31 16:48:09 -0700
committerEric Erfanian <erfanian@google.com>2017-09-07 04:37:37 +0000
commit53e1ce35f713139629cb24df6ea1245e11464a42 (patch)
treebf94bb3fcbf38857e65c4637aa0dde6bd637868b /java/com/android/dialer/simulator
parent273fd7bc5840a71cf8445455bc0bb1945e2cfc8d (diff)
Use simulator to add in-call UI integration tests
This CL uses the simulator connection service to perform integration tests for incallui. The main pieces of this CL are: - DialerCallEvent - this is how we track changes to the incallui calls - Simulator.Event - this is how we track changes to a simulator connection With the above two we can do things like: - block until a DialerCall switches from ACTIVE TO ONHOLD: - DialerCallEspresso.waitForNextEvent(tracker, call, new DialerCallEvent(STATE_CHANGE, "ACTIVE", "ONHOLD") - block for a connection to recive a particular DTMF code: - SimulatorConnectionEspresso.waitForNextEvent(call, Event.DTMF) Future CLs will include things like: - fling to answer / reject - conference calls - screenshot diffing - video calling Test: InCallActivityTest PiperOrigin-RevId: 167211015 Change-Id: Ib013b10fe963092fad0816b07b1659efd69d9468
Diffstat (limited to 'java/com/android/dialer/simulator')
-rw-r--r--java/com/android/dialer/simulator/Simulator.java48
-rw-r--r--java/com/android/dialer/simulator/impl/SimulatorConnection.java60
-rw-r--r--java/com/android/dialer/simulator/impl/SimulatorConnectionService.java50
-rw-r--r--java/com/android/dialer/simulator/impl/SimulatorSpamCallCreator.java2
-rw-r--r--java/com/android/dialer/simulator/impl/SimulatorVoiceCall.java2
5 files changed, 146 insertions, 16 deletions
diff --git a/java/com/android/dialer/simulator/Simulator.java b/java/com/android/dialer/simulator/Simulator.java
index 78058a48f..f4164158e 100644
--- a/java/com/android/dialer/simulator/Simulator.java
+++ b/java/com/android/dialer/simulator/Simulator.java
@@ -17,11 +17,59 @@
package com.android.dialer.simulator;
import android.content.Context;
+import android.support.annotation.IntDef;
+import android.support.annotation.Nullable;
import android.view.ActionProvider;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
/** Used to add menu items to the Dialer menu to test the app using simulated calls and data. */
public interface Simulator {
boolean shouldShow();
ActionProvider getActionProvider(Context context);
+
+ /** Information about a connection event. */
+ public static class Event {
+ /** The type of connection event. */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({
+ NONE,
+ ANSWER,
+ REJECT,
+ HOLD,
+ UNHOLD,
+ DISCONNECT,
+ STATE_CHANGE,
+ DTMF,
+ })
+ public @interface Type {}
+
+ public static final int NONE = -1;
+ public static final int ANSWER = 1;
+ public static final int REJECT = 2;
+ public static final int HOLD = 3;
+ public static final int UNHOLD = 4;
+ public static final int DISCONNECT = 5;
+ public static final int STATE_CHANGE = 6;
+ public static final int DTMF = 7;
+
+ @Type public final int type;
+ /** Holds event specific information. For example, for DTMF this could be the keycode. */
+ @Nullable public final String data1;
+ /**
+ * Holds event specific information. For example, for STATE_CHANGE this could be the new state.
+ */
+ @Nullable public final String data2;
+
+ public Event(@Type int type) {
+ this(type, null, null);
+ }
+
+ public Event(@Type int type, String data1, String data2) {
+ this.type = type;
+ this.data1 = data1;
+ this.data2 = data2;
+ }
+ }
}
diff --git a/java/com/android/dialer/simulator/impl/SimulatorConnection.java b/java/com/android/dialer/simulator/impl/SimulatorConnection.java
index 12d095890..b462b5405 100644
--- a/java/com/android/dialer/simulator/impl/SimulatorConnection.java
+++ b/java/com/android/dialer/simulator/impl/SimulatorConnection.java
@@ -16,41 +16,85 @@
package com.android.dialer.simulator.impl;
+import android.support.annotation.NonNull;
import android.telecom.Connection;
-import android.telecom.DisconnectCause;
+import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
+import com.android.dialer.simulator.Simulator.Event;
+import java.util.ArrayList;
+import java.util.List;
/** Represents a single phone call on the device. */
-final class SimulatorConnection extends Connection {
+public final class SimulatorConnection extends Connection {
+ private final List<Listener> listeners = new ArrayList<>();
+ private final List<Event> events = new ArrayList<>();
+ private int currentState = STATE_NEW;
+
+ public void addListener(@NonNull Listener listener) {
+ listeners.add(Assert.isNotNull(listener));
+ }
+
+ public void removeListener(@NonNull Listener listener) {
+ listeners.remove(Assert.isNotNull(listener));
+ }
+
+ @NonNull
+ public List<Event> getEvents() {
+ return events;
+ }
@Override
public void onAnswer() {
LogUtil.enterBlock("SimulatorConnection.onAnswer");
- setActive();
+ onEvent(new Event(Event.ANSWER));
}
@Override
public void onReject() {
LogUtil.enterBlock("SimulatorConnection.onReject");
- setDisconnected(new DisconnectCause(DisconnectCause.REJECTED));
+ onEvent(new Event(Event.REJECT));
}
@Override
public void onHold() {
LogUtil.enterBlock("SimulatorConnection.onHold");
- setOnHold();
+ onEvent(new Event(Event.HOLD));
}
@Override
public void onUnhold() {
LogUtil.enterBlock("SimulatorConnection.onUnhold");
- setActive();
+ onEvent(new Event(Event.UNHOLD));
}
@Override
public void onDisconnect() {
LogUtil.enterBlock("SimulatorConnection.onDisconnect");
- setDisconnected(new DisconnectCause(DisconnectCause.LOCAL));
- destroy();
+ onEvent(new Event(Event.DISCONNECT));
+ }
+
+ @Override
+ public void onStateChanged(int newState) {
+ LogUtil.enterBlock("SimulatorConnection.onStateChanged");
+ onEvent(new Event(Event.STATE_CHANGE, stateToString(currentState), stateToString(newState)));
+ currentState = newState;
+ }
+
+ @Override
+ public void onPlayDtmfTone(char c) {
+ LogUtil.enterBlock("SimulatorConnection.onPlayDtmfTone");
+ onEvent(new Event(Event.DTMF, Character.toString(c), null));
+ }
+
+ private void onEvent(@NonNull Event event) {
+ events.add(Assert.isNotNull(event));
+ for (Listener listener : listeners) {
+ listener.onEvent(this, event);
+ }
+ }
+
+ /** Callback for when a new event arrives. */
+ public interface Listener {
+ void onEvent(@NonNull SimulatorConnection connection, @NonNull Event event);
}
}
diff --git a/java/com/android/dialer/simulator/impl/SimulatorConnectionService.java b/java/com/android/dialer/simulator/impl/SimulatorConnectionService.java
index 9e107edee..06c2591cc 100644
--- a/java/com/android/dialer/simulator/impl/SimulatorConnectionService.java
+++ b/java/com/android/dialer/simulator/impl/SimulatorConnectionService.java
@@ -40,6 +40,7 @@ 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<>();
+ private static SimulatorConnectionService instance;
private static void register(@NonNull Context context) {
LogUtil.enterBlock("SimulatorConnectionService.register");
@@ -55,6 +56,30 @@ public class SimulatorConnectionService extends ConnectionService {
.unregisterPhoneAccount(buildPhoneAccount(context).getAccountHandle());
}
+ public static SimulatorConnectionService getInstance() {
+ return instance;
+ }
+
+ public static void addNewOutgoingCall(
+ @NonNull Context context, @NonNull Bundle extras, @NonNull String phoneNumber) {
+ LogUtil.enterBlock("SimulatorConnectionService.addNewOutgoingCall");
+ Assert.isNotNull(context);
+ Assert.isNotNull(extras);
+ Assert.isNotNull(phoneNumber);
+
+ register(context);
+
+ Bundle bundle = new Bundle(extras);
+ bundle.putBoolean(EXTRA_IS_SIMULATOR_CONNECTION, true);
+ Bundle outgoingCallExtras = new Bundle();
+ outgoingCallExtras.putBundle(TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS, bundle);
+
+ // Use the system's phone account so that these look like regular SIM call.
+ TelecomManager telecomManager = context.getSystemService(TelecomManager.class);
+ telecomManager.placeCall(
+ Uri.fromParts(PhoneAccount.SCHEME_TEL, phoneNumber, null), outgoingCallExtras);
+ }
+
public static void addNewIncomingCall(
@NonNull Context context, @NonNull Bundle extras, @NonNull String callerId) {
LogUtil.enterBlock("SimulatorConnectionService.addNewIncomingCall");
@@ -76,13 +101,11 @@ public class SimulatorConnectionService extends ConnectionService {
}
public static void addListener(@NonNull Listener listener) {
- Assert.isNotNull(listener);
- listeners.add(listener);
+ listeners.add(Assert.isNotNull(listener));
}
public static void removeListener(@NonNull Listener listener) {
- Assert.isNotNull(listener);
- listeners.remove(listener);
+ listeners.remove(Assert.isNotNull(listener));
}
@NonNull
@@ -112,6 +135,19 @@ public class SimulatorConnectionService extends ConnectionService {
}
@Override
+ public void onCreate() {
+ super.onCreate();
+ instance = this;
+ }
+
+ @Override
+ public void onDestroy() {
+ LogUtil.enterBlock("SimulatorConnectionService.onDestroy");
+ instance = null;
+ super.onDestroy();
+ }
+
+ @Override
public Connection onCreateOutgoingConnection(
PhoneAccountHandle phoneAccount, ConnectionRequest request) {
LogUtil.enterBlock("SimulatorConnectionService.onCreateOutgoingConnection");
@@ -127,10 +163,12 @@ public class SimulatorConnectionService extends ConnectionService {
}
SimulatorConnection connection = new SimulatorConnection();
- connection.setActive();
+ connection.setDialing();
connection.setAddress(request.getAddress(), TelecomManager.PRESENTATION_ALLOWED);
connection.setConnectionCapabilities(
- Connection.CAPABILITY_MUTE | Connection.CAPABILITY_SUPPORT_HOLD);
+ Connection.CAPABILITY_MUTE
+ | Connection.CAPABILITY_SUPPORT_HOLD
+ | Connection.CAPABILITY_HOLD);
connection.putExtras(request.getExtras());
for (Listener listener : listeners) {
diff --git a/java/com/android/dialer/simulator/impl/SimulatorSpamCallCreator.java b/java/com/android/dialer/simulator/impl/SimulatorSpamCallCreator.java
index 4b1d7a564..ae97bc162 100644
--- a/java/com/android/dialer/simulator/impl/SimulatorSpamCallCreator.java
+++ b/java/com/android/dialer/simulator/impl/SimulatorSpamCallCreator.java
@@ -88,7 +88,7 @@ final class SimulatorSpamCallCreator implements SimulatorConnectionService.Liste
extras.putInt(EXTRA_CALL_COUNT, callCount - 1);
extras.putBoolean(EXTRA_IS_SPAM_CALL_CONNECTION, true);
- // We need to clear the call log because spam notifiations are only shown for new calls.
+ // We need to clear the call log because spam notifications are only shown for new calls.
clearCallLog(context);
SimulatorConnectionService.addNewIncomingCall(context, extras, callerId);
diff --git a/java/com/android/dialer/simulator/impl/SimulatorVoiceCall.java b/java/com/android/dialer/simulator/impl/SimulatorVoiceCall.java
index 5930dff24..2512828b8 100644
--- a/java/com/android/dialer/simulator/impl/SimulatorVoiceCall.java
+++ b/java/com/android/dialer/simulator/impl/SimulatorVoiceCall.java
@@ -23,7 +23,7 @@ import com.android.dialer.common.LogUtil;
/** Utilities to simulate phone calls. */
final class SimulatorVoiceCall {
- public static void addNewIncomingCall(@NonNull Context context) {
+ 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";