summaryrefslogtreecommitdiff
path: root/java/com/android/dialer/simulator/impl/SimulatorVideoCall.java
diff options
context:
space:
mode:
authoryueg <yueg@google.com>2017-09-12 11:10:45 -0700
committerEric Erfanian <erfanian@google.com>2017-09-13 14:15:01 -0700
commit7f78e9a692d7d7ca1f1204421adce91545a880f8 (patch)
tree955bc0586790d75ec67753586e905eccf4224d98 /java/com/android/dialer/simulator/impl/SimulatorVideoCall.java
parentb21b9f9b2efbc358ee9806af87b7edc3f82af4da (diff)
Log swiping and clicking for switching tabs.
If it's a swipe, onPageScrolled() is called several times before onPageScrollStateChanged(SCROLL_STATE_SETTLING) and onPageSelected(). If it's a click, only onPageScrollStateChanged(SCROLL_STATE_SETTLING) is called before onPageSelected(). And onPageScrollStateChanged(SCROLL_STATE_SETTLING) will not be called if user don't switch to a new tab. We use the difference to tell if user switching tabs by swiping or clicking. Test: DialtactsActivityTest PiperOrigin-RevId: 168403148 Change-Id: Iaaf84ab9c4955d0bc2c1e9857ba59fd37b3984af
Diffstat (limited to 'java/com/android/dialer/simulator/impl/SimulatorVideoCall.java')
-rw-r--r--java/com/android/dialer/simulator/impl/SimulatorVideoCall.java164
1 files changed, 164 insertions, 0 deletions
diff --git a/java/com/android/dialer/simulator/impl/SimulatorVideoCall.java b/java/com/android/dialer/simulator/impl/SimulatorVideoCall.java
new file mode 100644
index 000000000..3f00ab183
--- /dev/null
+++ b/java/com/android/dialer/simulator/impl/SimulatorVideoCall.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2017 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
+ */
+
+package com.android.dialer.simulator.impl;
+
+import android.content.Context;
+import android.content.Intent;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.telecom.Connection;
+import android.telecom.DisconnectCause;
+import android.telecom.TelecomManager;
+import android.telecom.VideoProfile;
+import android.view.ActionProvider;
+import android.widget.Toast;
+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;
+
+/** Entry point in the simulator to create video calls. */
+final class SimulatorVideoCall
+ implements SimulatorConnectionService.Listener, SimulatorConnection.Listener {
+ @NonNull private final Context context;
+ private final int initialVideoCapability;
+ private final int initialVideoState;
+ @Nullable private String connectionTag;
+
+ static ActionProvider getActionProvider(@NonNull Context context) {
+ return new SimulatorSubMenu(context)
+ .addItem(
+ "Incoming one way",
+ () ->
+ new SimulatorVideoCall(context, VideoProfile.STATE_RX_ENABLED).addNewIncomingCall())
+ .addItem(
+ "Incoming two way",
+ () ->
+ new SimulatorVideoCall(context, VideoProfile.STATE_BIDIRECTIONAL)
+ .addNewIncomingCall())
+ .addItem(
+ "Outgoing one way",
+ () ->
+ new SimulatorVideoCall(context, VideoProfile.STATE_TX_ENABLED).addNewOutgoingCall())
+ .addItem(
+ "Outgoing two way",
+ () ->
+ new SimulatorVideoCall(context, VideoProfile.STATE_BIDIRECTIONAL)
+ .addNewOutgoingCall());
+ }
+
+ private SimulatorVideoCall(@NonNull Context context, int initialVideoState) {
+ this.context = Assert.isNotNull(context);
+ this.initialVideoCapability =
+ Connection.CAPABILITY_SUPPORTS_VT_LOCAL_BIDIRECTIONAL
+ | Connection.CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL;
+ this.initialVideoState = initialVideoState;
+ SimulatorConnectionService.addListener(this);
+ }
+
+ private void addNewIncomingCall() {
+ if (!isVideoAccountEnabled()) {
+ showVideoAccountSettings();
+ return;
+ }
+ String callerId = "+44 (0) 20 7031 3000"; // Google London office
+ connectionTag =
+ SimulatorSimCallManager.addNewIncomingCall(context, callerId, true /* isVideo */);
+ }
+
+ private void addNewOutgoingCall() {
+ if (!isVideoAccountEnabled()) {
+ showVideoAccountSettings();
+ return;
+ }
+ String phoneNumber = "+44 (0) 20 7031 3000"; // Google London office
+ connectionTag =
+ SimulatorSimCallManager.addNewOutgoingCall(context, phoneNumber, true /* isVideo */);
+ }
+
+ @Override
+ public void onNewOutgoingConnection(@NonNull SimulatorConnection connection) {
+ if (connection.getExtras().getBoolean(connectionTag)) {
+ LogUtil.i("SimulatorVideoCall.onNewOutgoingConnection", "connection created");
+ handleNewConnection(connection);
+ // Telecom will force the connection to switch to Dialing when we return it. Wait until after
+ // we're returned it before changing call state.
+ ThreadUtil.postOnUiThread(() -> connection.setActive());
+ }
+ }
+
+ @Override
+ public void onNewIncomingConnection(@NonNull SimulatorConnection connection) {
+ if (connection.getExtras().getBoolean(connectionTag)) {
+ LogUtil.i("SimulatorVideoCall.onNewIncomingConnection", "connection created");
+ handleNewConnection(connection);
+ }
+ }
+
+ private boolean isVideoAccountEnabled() {
+ SimulatorSimCallManager.register(context);
+ return context
+ .getSystemService(TelecomManager.class)
+ .getPhoneAccount(SimulatorSimCallManager.getVideoProviderHandle(context))
+ .isEnabled();
+ }
+
+ private void showVideoAccountSettings() {
+ context.startActivity(new Intent(TelecomManager.ACTION_CHANGE_PHONE_ACCOUNTS));
+ Toast.makeText(context, "Please enable simulator video provider", Toast.LENGTH_LONG).show();
+ }
+
+ private void handleNewConnection(@NonNull SimulatorConnection connection) {
+ connection.addListener(this);
+ connection.setConnectionCapabilities(
+ connection.getConnectionCapabilities() | initialVideoCapability);
+ connection.setVideoState(initialVideoState);
+ }
+
+ @Override
+ public void onEvent(@NonNull SimulatorConnection connection, @NonNull Event event) {
+ switch (event.type) {
+ case Event.NONE:
+ throw Assert.createIllegalStateFailException();
+ case Event.ANSWER:
+ connection.setVideoState(Integer.parseInt(event.data1));
+ 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();
+ }
+ }
+}