summaryrefslogtreecommitdiff
path: root/java/com/android/dialer/precall
diff options
context:
space:
mode:
authortwyen <twyen@google.com>2018-05-07 16:36:17 -0700
committerCopybara-Service <copybara-piper@google.com>2018-05-09 16:53:51 -0700
commitb2b6365629aed422a006529fe7940612f778baed (patch)
treeac481d7c67921e64c957dafcd7b553b2be0f7c93 /java/com/android/dialer/precall
parentd7c058c4e1bfd772e514f6d09deb21d7893d28c8 (diff)
Place Duo calls with PreCall
This CL consolidates common duo calling operations into precall, including checking reachability, falling back to carrier video call, placing the call to duo with startActivityForResult. TEST=TAP Bug: 78783816 Test: TAP PiperOrigin-RevId: 195742478 Change-Id: I9fea1e4999f604e1f3a153b28079cd0db77b7393
Diffstat (limited to 'java/com/android/dialer/precall')
-rw-r--r--java/com/android/dialer/precall/PreCallCoordinator.java6
-rw-r--r--java/com/android/dialer/precall/impl/DuoAction.java97
-rw-r--r--java/com/android/dialer/precall/impl/PreCallCoordinatorImpl.java20
-rw-r--r--java/com/android/dialer/precall/impl/PreCallModule.java3
4 files changed, 121 insertions, 5 deletions
diff --git a/java/com/android/dialer/precall/PreCallCoordinator.java b/java/com/android/dialer/precall/PreCallCoordinator.java
index 9c24e0d69..4d4859a80 100644
--- a/java/com/android/dialer/precall/PreCallCoordinator.java
+++ b/java/com/android/dialer/precall/PreCallCoordinator.java
@@ -68,8 +68,8 @@ public interface PreCallCoordinator {
@NonNull
PendingAction startPendingAction();
- <Output> void listen(
- ListenableFuture<Output> future,
- Consumer<Output> successListener,
+ <OutputT> void listen(
+ ListenableFuture<OutputT> future,
+ Consumer<OutputT> successListener,
Consumer<Throwable> failureListener);
}
diff --git a/java/com/android/dialer/precall/impl/DuoAction.java b/java/com/android/dialer/precall/impl/DuoAction.java
new file mode 100644
index 000000000..c05fbe12f
--- /dev/null
+++ b/java/com/android/dialer/precall/impl/DuoAction.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2018 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.precall.impl;
+
+import android.content.Context;
+import android.content.Intent;
+import com.android.dialer.callintent.CallIntentBuilder;
+import com.android.dialer.common.LogUtil;
+import com.android.dialer.common.concurrent.Annotations.Ui;
+import com.android.dialer.duo.Duo.ReachabilityData;
+import com.android.dialer.duo.DuoComponent;
+import com.android.dialer.precall.PreCallAction;
+import com.android.dialer.precall.PreCallCoordinator;
+import com.android.dialer.precall.PreCallCoordinator.PendingAction;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.ListeningExecutorService;
+import javax.inject.Inject;
+
+/**
+ * Checks if a duo call is actually callable, and request an activity for {@link
+ * android.app.Activity#startActivityForResult(Intent, int)}
+ */
+public class DuoAction implements PreCallAction {
+
+ private final ListeningExecutorService uiExecutor;
+
+ @Inject
+ DuoAction(@Ui ListeningExecutorService uiExecutor) {
+ this.uiExecutor = uiExecutor;
+ }
+
+ @Override
+ public boolean requiresUi(Context context, CallIntentBuilder builder) {
+ // Duo call must be started with startActivityForResult() which needs a activity.
+ return builder.isDuoCall();
+ }
+
+ @Override
+ public void runWithoutUi(Context context, CallIntentBuilder builder) {}
+
+ @Override
+ public void runWithUi(PreCallCoordinator coordinator) {
+ if (!requiresUi(coordinator.getActivity(), coordinator.getBuilder())) {
+ return;
+ }
+ String number = coordinator.getBuilder().getUri().getSchemeSpecificPart();
+ ListenableFuture<ImmutableMap<String, ReachabilityData>> reachabilities =
+ DuoComponent.get(coordinator.getActivity())
+ .getDuo()
+ .updateReachability(coordinator.getActivity(), ImmutableList.of(number));
+ PendingAction pendingAction = coordinator.startPendingAction();
+
+ Futures.addCallback(
+ reachabilities,
+ new FutureCallback<ImmutableMap<String, ReachabilityData>>() {
+ @Override
+ public void onSuccess(ImmutableMap<String, ReachabilityData> result) {
+ if (!result.containsKey(number) || !result.get(number).videoCallable()) {
+ LogUtil.w(
+ "DuoAction.runWithUi",
+ number + " number no longer duo reachable, falling back to carrier video call");
+ coordinator.getBuilder().setIsDuoCall(false);
+ }
+ pendingAction.finish();
+ }
+
+ @Override
+ public void onFailure(Throwable throwable) {
+ LogUtil.e("DuoAction.runWithUi", "reachability query failed", throwable);
+ coordinator.getBuilder().setIsDuoCall(false);
+ pendingAction.finish();
+ }
+ },
+ uiExecutor);
+ }
+
+ @Override
+ public void onDiscard() {}
+}
diff --git a/java/com/android/dialer/precall/impl/PreCallCoordinatorImpl.java b/java/com/android/dialer/precall/impl/PreCallCoordinatorImpl.java
index f2ff0e3e3..240549ca5 100644
--- a/java/com/android/dialer/precall/impl/PreCallCoordinatorImpl.java
+++ b/java/com/android/dialer/precall/impl/PreCallCoordinatorImpl.java
@@ -26,6 +26,7 @@ import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
import com.android.dialer.common.concurrent.DialerExecutorComponent;
import com.android.dialer.common.concurrent.UiListener;
+import com.android.dialer.duo.DuoComponent;
import com.android.dialer.function.Consumer;
import com.android.dialer.logging.DialerImpression.Type;
import com.android.dialer.logging.Logger;
@@ -33,6 +34,7 @@ import com.android.dialer.precall.PreCallAction;
import com.android.dialer.precall.PreCallComponent;
import com.android.dialer.precall.PreCallCoordinator;
import com.android.dialer.telecom.TelecomUtil;
+import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
@@ -101,7 +103,7 @@ public class PreCallCoordinatorImpl implements PreCallCoordinator {
LogUtil.enterBlock("PreCallCoordinatorImpl.runNextAction");
Assert.checkArgument(currentAction == null);
if (currentActionIndex >= actions.size()) {
- TelecomUtil.placeCall(activity, builder.build());
+ placeCall();
activity.finish();
return;
}
@@ -177,4 +179,20 @@ public class PreCallCoordinatorImpl implements PreCallCoordinator {
output -> successListener.accept((OutputT) output),
failureListener::accept);
}
+
+ private void placeCall() {
+ if (builder.isDuoCall()) {
+ Optional<Intent> intent =
+ DuoComponent.get(activity)
+ .getDuo()
+ .getCallIntent(builder.getUri().getSchemeSpecificPart());
+ if (intent.isPresent()) {
+ activity.startActivityForResult(intent.get(), 0);
+ return;
+ } else {
+ LogUtil.e("PreCallCoordinatorImpl.placeCall", "duo.getCallIntent() returned absent");
+ }
+ }
+ TelecomUtil.placeCall(activity, builder.build());
+ }
}
diff --git a/java/com/android/dialer/precall/impl/PreCallModule.java b/java/com/android/dialer/precall/impl/PreCallModule.java
index 9820e2b66..455453ef3 100644
--- a/java/com/android/dialer/precall/impl/PreCallModule.java
+++ b/java/com/android/dialer/precall/impl/PreCallModule.java
@@ -37,12 +37,13 @@ public abstract class PreCallModule {
@Provides
@Singleton
public static ImmutableList<PreCallAction> provideActions(
- CallingAccountSelector callingAccountSelector) {
+ DuoAction duoAction, CallingAccountSelector callingAccountSelector) {
return ImmutableList.of(
new PermissionCheckAction(),
new MalformedNumberRectifier(
ImmutableList.of(new UkRegionPrefixInInternationalFormatHandler())),
callingAccountSelector,
+ duoAction,
new AssistedDialAction());
}
}