summaryrefslogtreecommitdiff
path: root/java/com/android/dialer/precall/impl/PreCallCoordinatorImpl.java
diff options
context:
space:
mode:
authortwyen <twyen@google.com>2017-11-07 14:19:23 -0800
committerZachary Heidepriem <zachh@google.com>2017-11-11 12:19:01 -0800
commitb0ed171b1c9d5b5d5e686b31be623c99ced15cf0 (patch)
treea2cfecc9e0c1d1e920487a04f1e91acc8e7dfd8b /java/com/android/dialer/precall/impl/PreCallCoordinatorImpl.java
parentfe23fd3894e266095d8c882b8dd66065f7092d5d (diff)
Implement PreCallCoordinator
When the user makes a call, the PreCallCoordinator will get a list of actions to perform from PreCallActionProviderComponent and apply them to the pending CallIntentBuilder, before sending the built intent to telecom Bug: 64216442 Test: PreCallExecutorImplTest PiperOrigin-RevId: 174911537 Change-Id: Ide5ec431d4e6e7879fcdfdbbbd7ea5eed9963b2c
Diffstat (limited to 'java/com/android/dialer/precall/impl/PreCallCoordinatorImpl.java')
-rw-r--r--java/com/android/dialer/precall/impl/PreCallCoordinatorImpl.java153
1 files changed, 153 insertions, 0 deletions
diff --git a/java/com/android/dialer/precall/impl/PreCallCoordinatorImpl.java b/java/com/android/dialer/precall/impl/PreCallCoordinatorImpl.java
new file mode 100644
index 000000000..25083ef0b
--- /dev/null
+++ b/java/com/android/dialer/precall/impl/PreCallCoordinatorImpl.java
@@ -0,0 +1,153 @@
+/*
+ * 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.precall.impl;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import com.android.dialer.callintent.CallIntentBuilder;
+import com.android.dialer.common.Assert;
+import com.android.dialer.common.LogUtil;
+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.collect.ImmutableList;
+
+/**
+ * Implements {@link PreCallCoordinator}. Listens to the life cycle of {@link PreCallActivity} to
+ * save/restore states.
+ */
+public class PreCallCoordinatorImpl implements PreCallCoordinator {
+
+ private static final String SAVED_STATE_CURRENT_ACTION = "current_action";
+
+ static final String EXTRA_CALL_INTENT_BUILDER = "extra_call_intent_builder";
+
+ @NonNull private final Activity activity;
+
+ private CallIntentBuilder builder;
+ private ImmutableList<PreCallAction> actions;
+ private int currentActionIndex = 0;
+ private PreCallAction currentAction;
+ private PendingAction pendingAction;
+ private boolean aborted = false;
+
+ PreCallCoordinatorImpl(@NonNull Activity activity) {
+ this.activity = Assert.isNotNull(activity);
+ }
+
+ void onCreate(Intent intent, @Nullable Bundle savedInstanceState) {
+ LogUtil.enterBlock("PreCallCoordinatorImpl.onCreate");
+ if (savedInstanceState != null) {
+ currentActionIndex = savedInstanceState.getInt(SAVED_STATE_CURRENT_ACTION);
+ builder = Assert.isNotNull(savedInstanceState.getParcelable(EXTRA_CALL_INTENT_BUILDER));
+ } else {
+ builder = Assert.isNotNull(intent.getParcelableExtra(EXTRA_CALL_INTENT_BUILDER));
+ }
+ actions = PreCallComponent.get(activity).getPreCall().getActions();
+ }
+
+ void onRestoreInstanceState(Bundle savedInstanceState) {
+ currentActionIndex = savedInstanceState.getInt(SAVED_STATE_CURRENT_ACTION);
+ builder = savedInstanceState.getParcelable(EXTRA_CALL_INTENT_BUILDER);
+ }
+
+ void onResume() {
+ runNextAction();
+ }
+
+ void onPause() {
+ if (currentAction != null) {
+ currentAction.onDiscard();
+ }
+ currentAction = null;
+ }
+
+ void onSaveInstanceState(Bundle outState) {
+ outState.putInt(SAVED_STATE_CURRENT_ACTION, currentActionIndex);
+ outState.putParcelable(EXTRA_CALL_INTENT_BUILDER, builder);
+ }
+
+ private void runNextAction() {
+ LogUtil.enterBlock("PreCallCoordinatorImpl.runNextAction");
+ Assert.checkArgument(currentAction == null);
+ if (currentActionIndex >= actions.size()) {
+ TelecomUtil.placeCall(activity, builder.build());
+ activity.finish();
+ return;
+ }
+ LogUtil.i("PreCallCoordinatorImpl.runNextAction", "running " + actions.get(currentActionIndex));
+ currentAction = actions.get(currentActionIndex);
+ actions.get(currentActionIndex).run(this);
+ if (pendingAction == null) {
+ onActionFinished();
+ }
+ }
+
+ private void onActionFinished() {
+ LogUtil.enterBlock("PreCallCoordinatorImpl.onActionFinished");
+ Assert.isNotNull(currentAction);
+ currentAction = null;
+ currentActionIndex++;
+ if (!aborted) {
+ runNextAction();
+ } else {
+ activity.finish();
+ }
+ }
+
+ @Override
+ public void abortCall() {
+ Assert.checkState(currentAction != null);
+ aborted = true;
+ }
+
+ @NonNull
+ @Override
+ public CallIntentBuilder getBuilder() {
+ return builder;
+ }
+
+ @NonNull
+ @Override
+ public Activity getActivity() {
+ return activity;
+ }
+
+ @Override
+ @NonNull
+ public PendingAction startPendingAction() {
+ Assert.isMainThread();
+ Assert.isNotNull(currentAction);
+ Assert.checkArgument(pendingAction == null);
+ pendingAction = new PendingActionImpl();
+ return pendingAction;
+ }
+
+ private class PendingActionImpl implements PendingAction {
+
+ @Override
+ public void finish() {
+ Assert.checkArgument(pendingAction == this);
+ pendingAction = null;
+ onActionFinished();
+ }
+ }
+}