blob: a0c76f3452330a26b7a80ebc1a76b0dc4e3ce1f7 [file] [log] [blame]
Eric Erfanianccca3152017-02-22 16:32:36 -08001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
15 */
16
17package com.android.incallui;
18
19import android.content.Context;
Eric Erfanian2ca43182017-08-31 06:57:16 -070020import android.os.SystemClock;
Eric Erfanianccca3152017-02-22 16:32:36 -080021import android.support.annotation.FloatRange;
22import android.support.annotation.NonNull;
23import android.support.v4.os.UserManagerCompat;
Eric Erfaniand5e47f62017-03-15 14:41:07 -070024import android.telecom.VideoProfile;
Eric Erfanianccca3152017-02-22 16:32:36 -080025import com.android.dialer.common.Assert;
26import com.android.dialer.common.LogUtil;
Eric Erfanian2ca43182017-08-31 06:57:16 -070027import com.android.dialer.common.concurrent.ThreadUtil;
Eric Erfanian8369df02017-05-03 10:27:13 -070028import com.android.dialer.logging.DialerImpression;
29import com.android.dialer.logging.Logger;
Eric Erfanianccca3152017-02-22 16:32:36 -080030import com.android.incallui.answer.protocol.AnswerScreen;
31import com.android.incallui.answer.protocol.AnswerScreenDelegate;
32import com.android.incallui.answerproximitysensor.AnswerProximitySensor;
33import com.android.incallui.answerproximitysensor.PseudoScreenState;
Eric Erfanian90508232017-03-24 09:31:16 -070034import com.android.incallui.call.CallList;
Eric Erfanianccca3152017-02-22 16:32:36 -080035import com.android.incallui.call.DialerCall;
Eric Erfanian90508232017-03-24 09:31:16 -070036import com.android.incallui.call.DialerCallListener;
twyen8efb4952017-10-06 16:35:54 -070037import com.android.incallui.incalluilock.InCallUiLock;
Eric Erfanianccca3152017-02-22 16:32:36 -080038
39/** Manages changes for an incoming call screen. */
40public class AnswerScreenPresenter
41 implements AnswerScreenDelegate, DialerCall.CannedTextResponsesLoadedListener {
Eric Erfanian2ca43182017-08-31 06:57:16 -070042 private static final int ACCEPT_REJECT_CALL_TIME_OUT_IN_MILLIS = 5000;
43
Eric Erfanianccca3152017-02-22 16:32:36 -080044 @NonNull private final Context context;
45 @NonNull private final AnswerScreen answerScreen;
46 @NonNull private final DialerCall call;
Eric Erfanian2ca43182017-08-31 06:57:16 -070047 private long actionPerformedTimeMillis;
Eric Erfanianccca3152017-02-22 16:32:36 -080048
Eric Erfanian2ca43182017-08-31 06:57:16 -070049 AnswerScreenPresenter(
Eric Erfanianccca3152017-02-22 16:32:36 -080050 @NonNull Context context, @NonNull AnswerScreen answerScreen, @NonNull DialerCall call) {
51 LogUtil.i("AnswerScreenPresenter.constructor", null);
52 this.context = Assert.isNotNull(context);
53 this.answerScreen = Assert.isNotNull(answerScreen);
54 this.call = Assert.isNotNull(call);
55 if (isSmsResponseAllowed(call)) {
56 answerScreen.setTextResponses(call.getCannedSmsResponses());
57 }
58 call.addCannedTextResponsesLoadedListener(this);
59
60 PseudoScreenState pseudoScreenState = InCallPresenter.getInstance().getPseudoScreenState();
61 if (AnswerProximitySensor.shouldUse(context, call)) {
62 new AnswerProximitySensor(context, call, pseudoScreenState);
63 } else {
64 pseudoScreenState.setOn(true);
65 }
66 }
67
68 @Override
Eric Erfanian2ca43182017-08-31 06:57:16 -070069 public boolean isActionTimeout() {
70 return actionPerformedTimeMillis != 0
71 && SystemClock.elapsedRealtime() - actionPerformedTimeMillis
72 >= ACCEPT_REJECT_CALL_TIME_OUT_IN_MILLIS;
73 }
74
75 @Override
twyen8efb4952017-10-06 16:35:54 -070076 public InCallUiLock acquireInCallUiLock(String tag) {
77 return InCallPresenter.getInstance().acquireInCallUiLock(tag);
78 }
79
80 @Override
Eric Erfanianccca3152017-02-22 16:32:36 -080081 public void onAnswerScreenUnready() {
82 call.removeCannedTextResponsesLoadedListener(this);
83 }
84
85 @Override
Eric Erfanianccca3152017-02-22 16:32:36 -080086 public void onRejectCallWithMessage(String message) {
87 call.reject(true /* rejectWithMessage */, message);
Eric Erfanian2ca43182017-08-31 06:57:16 -070088 addTimeoutCheck();
Eric Erfanianccca3152017-02-22 16:32:36 -080089 }
90
91 @Override
Eric Erfaniand5e47f62017-03-15 14:41:07 -070092 public void onAnswer(boolean answerVideoAsAudio) {
Eric Erfanianccca3152017-02-22 16:32:36 -080093 if (answerScreen.isVideoUpgradeRequest()) {
Eric Erfaniand5e47f62017-03-15 14:41:07 -070094 if (answerVideoAsAudio) {
Eric Erfanian8369df02017-05-03 10:27:13 -070095 Logger.get(context)
96 .logCallImpression(
97 DialerImpression.Type.VIDEO_CALL_REQUEST_ACCEPTED_AS_AUDIO,
98 call.getUniqueCallId(),
99 call.getTimeAddedMs());
Eric Erfaniand5e47f62017-03-15 14:41:07 -0700100 call.getVideoTech().acceptVideoRequestAsAudio();
101 } else {
Eric Erfanian8369df02017-05-03 10:27:13 -0700102 Logger.get(context)
103 .logCallImpression(
104 DialerImpression.Type.VIDEO_CALL_REQUEST_ACCEPTED,
105 call.getUniqueCallId(),
106 call.getTimeAddedMs());
twyen59209802017-09-13 10:37:01 -0700107 call.getVideoTech().acceptVideoRequest(context);
Eric Erfaniand5e47f62017-03-15 14:41:07 -0700108 }
Eric Erfanianccca3152017-02-22 16:32:36 -0800109 } else {
Eric Erfaniand5e47f62017-03-15 14:41:07 -0700110 if (answerVideoAsAudio) {
111 call.answer(VideoProfile.STATE_AUDIO_ONLY);
112 } else {
113 call.answer();
114 }
Eric Erfanianccca3152017-02-22 16:32:36 -0800115 }
Eric Erfanian2ca43182017-08-31 06:57:16 -0700116 addTimeoutCheck();
Eric Erfanianccca3152017-02-22 16:32:36 -0800117 }
118
119 @Override
120 public void onReject() {
121 if (answerScreen.isVideoUpgradeRequest()) {
Eric Erfanian8369df02017-05-03 10:27:13 -0700122 Logger.get(context)
123 .logCallImpression(
124 DialerImpression.Type.VIDEO_CALL_REQUEST_DECLINED,
125 call.getUniqueCallId(),
126 call.getTimeAddedMs());
Eric Erfaniand5e47f62017-03-15 14:41:07 -0700127 call.getVideoTech().declineVideoRequest();
Eric Erfanianccca3152017-02-22 16:32:36 -0800128 } else {
129 call.reject(false /* rejectWithMessage */, null);
130 }
Eric Erfanian2ca43182017-08-31 06:57:16 -0700131 addTimeoutCheck();
Eric Erfanianccca3152017-02-22 16:32:36 -0800132 }
133
134 @Override
erfaniand05d8992018-03-20 19:42:26 -0700135 public void onSpeakEasyCall() {
136 LogUtil.enterBlock("AnswerScreenPresenter.onSpeakEasyCall");
137 DialerCall incomingCall = CallList.getInstance().getIncomingCall();
138 if (incomingCall == null) {
139 LogUtil.i("AnswerScreenPresenter.onSpeakEasyCall", "incomingCall == null");
140 return;
141 }
142 incomingCall.setIsSpeakEasyCall(true);
143 incomingCall.answer();
144 }
145
146 @Override
Eric Erfanian90508232017-03-24 09:31:16 -0700147 public void onAnswerAndReleaseCall() {
Eric Erfaniand8046e52017-04-06 09:41:50 -0700148 LogUtil.enterBlock("AnswerScreenPresenter.onAnswerAndReleaseCall");
Eric Erfanian90508232017-03-24 09:31:16 -0700149 DialerCall activeCall = CallList.getInstance().getActiveCall();
150 if (activeCall == null) {
Eric Erfaniand8046e52017-04-06 09:41:50 -0700151 LogUtil.i("AnswerScreenPresenter.onAnswerAndReleaseCall", "activeCall == null");
Eric Erfanian90508232017-03-24 09:31:16 -0700152 onAnswer(false);
153 } else {
Eric Erfanian2ca43182017-08-31 06:57:16 -0700154 activeCall.setReleasedByAnsweringSecondCall(true);
Eric Erfanian90508232017-03-24 09:31:16 -0700155 activeCall.addListener(new AnswerOnDisconnected(activeCall));
156 activeCall.disconnect();
157 }
Eric Erfanian2ca43182017-08-31 06:57:16 -0700158 addTimeoutCheck();
159 }
160
161 @Override
162 public void onAnswerAndReleaseButtonDisabled() {
163 DialerCall activeCall = CallList.getInstance().getActiveCall();
164 if (activeCall != null) {
165 activeCall.increaseSecondCallWithoutAnswerAndReleasedButtonTimes();
166 }
167 }
168
169 @Override
170 public void onAnswerAndReleaseButtonEnabled() {
171 DialerCall activeCall = CallList.getInstance().getActiveCall();
172 if (activeCall != null) {
173 activeCall.increaseAnswerAndReleaseButtonDisplayedTimes();
174 }
Eric Erfanian90508232017-03-24 09:31:16 -0700175 }
176
177 @Override
Eric Erfanianccca3152017-02-22 16:32:36 -0800178 public void onCannedTextResponsesLoaded(DialerCall call) {
179 if (isSmsResponseAllowed(call)) {
180 answerScreen.setTextResponses(call.getCannedSmsResponses());
181 }
182 }
183
184 @Override
185 public void updateWindowBackgroundColor(@FloatRange(from = -1f, to = 1.0f) float progress) {
186 InCallActivity activity = (InCallActivity) answerScreen.getAnswerScreenFragment().getActivity();
187 if (activity != null) {
188 activity.updateWindowBackgroundColor(progress);
189 }
190 }
191
Eric Erfanian90508232017-03-24 09:31:16 -0700192 private class AnswerOnDisconnected implements DialerCallListener {
193
194 private final DialerCall disconnectingCall;
195
Eric Erfanian2ca43182017-08-31 06:57:16 -0700196 AnswerOnDisconnected(DialerCall disconnectingCall) {
Eric Erfanian90508232017-03-24 09:31:16 -0700197 this.disconnectingCall = disconnectingCall;
198 }
199
200 @Override
201 public void onDialerCallDisconnect() {
Eric Erfaniand8046e52017-04-06 09:41:50 -0700202 LogUtil.i(
203 "AnswerScreenPresenter.AnswerOnDisconnected", "call disconnected, answering new call");
Eric Erfanian90508232017-03-24 09:31:16 -0700204 call.answer();
205 disconnectingCall.removeListener(this);
206 }
207
208 @Override
209 public void onDialerCallUpdate() {}
210
211 @Override
212 public void onDialerCallChildNumberChange() {}
213
214 @Override
215 public void onDialerCallLastForwardedNumberChange() {}
216
217 @Override
218 public void onDialerCallUpgradeToVideo() {}
219
220 @Override
221 public void onDialerCallSessionModificationStateChange() {}
222
223 @Override
224 public void onWiFiToLteHandover() {}
225
226 @Override
227 public void onHandoverToWifiFailure() {}
Eric Erfanianc857f902017-05-15 14:05:33 -0700228
229 @Override
230 public void onInternationalCallOnWifi() {}
Eric Erfanian2ca43182017-08-31 06:57:16 -0700231
232 @Override
233 public void onEnrichedCallSessionUpdate() {}
Eric Erfanian90508232017-03-24 09:31:16 -0700234 }
235
Eric Erfanianccca3152017-02-22 16:32:36 -0800236 private boolean isSmsResponseAllowed(DialerCall call) {
237 return UserManagerCompat.isUserUnlocked(context)
238 && call.can(android.telecom.Call.Details.CAPABILITY_RESPOND_VIA_TEXT);
239 }
Eric Erfanian2ca43182017-08-31 06:57:16 -0700240
241 private void addTimeoutCheck() {
242 actionPerformedTimeMillis = SystemClock.elapsedRealtime();
243 if (answerScreen.getAnswerScreenFragment().isVisible()) {
244 ThreadUtil.postDelayedOnUiThread(
245 () -> {
246 if (!answerScreen.getAnswerScreenFragment().isVisible()) {
247 LogUtil.d(
248 "AnswerScreenPresenter.addTimeoutCheck",
249 "accept/reject call timed out, do nothing");
250 return;
251 }
252 LogUtil.i("AnswerScreenPresenter.addTimeoutCheck", "accept/reject call timed out");
253 // Force re-evaluate which fragment to show.
254 InCallPresenter.getInstance().refreshUi();
255 },
256 ACCEPT_REJECT_CALL_TIME_OUT_IN_MILLIS);
257 }
258 }
Eric Erfanianccca3152017-02-22 16:32:36 -0800259}