17df3ac3f95c9d23396e1319beb6ca34435d965f5Chiao Cheng/*
27df3ac3f95c9d23396e1319beb6ca34435d965f5Chiao Cheng * Copyright (C) 2013 The Android Open Source Project
37df3ac3f95c9d23396e1319beb6ca34435d965f5Chiao Cheng *
47df3ac3f95c9d23396e1319beb6ca34435d965f5Chiao Cheng * Licensed under the Apache License, Version 2.0 (the "License");
57df3ac3f95c9d23396e1319beb6ca34435d965f5Chiao Cheng * you may not use this file except in compliance with the License.
67df3ac3f95c9d23396e1319beb6ca34435d965f5Chiao Cheng * You may obtain a copy of the License at
77df3ac3f95c9d23396e1319beb6ca34435d965f5Chiao Cheng *
87df3ac3f95c9d23396e1319beb6ca34435d965f5Chiao Cheng *      http://www.apache.org/licenses/LICENSE-2.0
97df3ac3f95c9d23396e1319beb6ca34435d965f5Chiao Cheng *
107df3ac3f95c9d23396e1319beb6ca34435d965f5Chiao Cheng * Unless required by applicable law or agreed to in writing, software
117df3ac3f95c9d23396e1319beb6ca34435d965f5Chiao Cheng * distributed under the License is distributed on an "AS IS" BASIS,
127df3ac3f95c9d23396e1319beb6ca34435d965f5Chiao Cheng * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137df3ac3f95c9d23396e1319beb6ca34435d965f5Chiao Cheng * See the License for the specific language governing permissions and
147df3ac3f95c9d23396e1319beb6ca34435d965f5Chiao Cheng * limitations under the License
157df3ac3f95c9d23396e1319beb6ca34435d965f5Chiao Cheng */
167df3ac3f95c9d23396e1319beb6ca34435d965f5Chiao Cheng
17dba5a7df121b4904b94e14439cca8996d843c1c9Chiao Chengpackage com.android.incallui;
18dba5a7df121b4904b94e14439cca8996d843c1c9Chiao Cheng
19fe4982c221c8ee734afedc4d005661d9c6c1ac31Andrew Leeimport android.content.Context;
20189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee
21a064920e8e428d73dc89484ad80cd27985df96d5Yorke Leeimport com.android.dialer.util.TelecomUtil;
22189e1efe04d1073a2abd100eb33b267435951ff3Yorke Leeimport com.android.incallui.InCallPresenter.InCallState;
23f66b7ca229eccd343bdffa8591aaa4ab6395488eTyler Gunn
248bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumarimport android.telecom.VideoProfile;
25b48e2280930b5ed0b04dd34d59dc5980b379a475Sailesh Nepal
2634f735625b79f7250b72d9471fab837b90139de3Santos Cordonimport java.util.List;
2710196fd2f7cc922693e2a7c6c932725a52157943Christine Chen
28dba5a7df121b4904b94e14439cca8996d843c1c9Chiao Cheng/**
29189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee * Presenter for the Incoming call widget. The {@link AnswerPresenter} handles the logic during
30189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee * incoming calls. It is also in charge of responding to incoming calls, so there needs to be
31189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee * an instance alive so that it can receive onIncomingCall callbacks.
32189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee *
33189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee * An instance of {@link AnswerPresenter} is created by InCallPresenter at startup, registers
34189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee * for callbacks via InCallPresenter, and shows/hides the {@link AnswerFragment} via IncallActivity.
35189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee *
36dba5a7df121b4904b94e14439cca8996d843c1c9Chiao Cheng */
37671b221ccadea34fb9327ef5342b26419eb5ca99Santos Cordonpublic class AnswerPresenter extends Presenter<AnswerPresenter.AnswerUi>
38189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee        implements CallList.CallUpdateListener, InCallPresenter.InCallUiListener,
39a45890b8f8cd7d56e2f7f756788d9855eb5b0bc4Prerepa Viswanadham                InCallPresenter.IncomingCallListener,
40a45890b8f8cd7d56e2f7f756788d9855eb5b0bc4Prerepa Viswanadham                CallList.Listener {
41671b221ccadea34fb9327ef5342b26419eb5ca99Santos Cordon
428b6c8d0dbfba6eabe3d835f8cdcec8a13e253d0cChiao Cheng    private static final String TAG = AnswerPresenter.class.getSimpleName();
438b6c8d0dbfba6eabe3d835f8cdcec8a13e253d0cChiao Cheng
446af0c61c32da6cfb400168ae3b0cf9f802abfed4Sailesh Nepal    private String mCallId;
45647462d7ca1cfaf28c76d573bd9a4e11d493a623Christine Chen    private Call mCall = null;
463034f16f6b74004738ca8e85cefc3f503679f44fYorke Lee    private boolean mHasTextMessages = false;
47dba5a7df121b4904b94e14439cca8996d843c1c9Chiao Cheng
48150a5c58c67f230c8fd7293b180bbf50aa761480Santos Cordon    @Override
49189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee    public void onUiShowing(boolean showing) {
50189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee        if (showing) {
51189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee            final CallList calls = CallList.getInstance();
52189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee            Call call;
53189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee            call = calls.getIncomingCall();
54189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee            if (call != null) {
55189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee                processIncomingCall(call);
56189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee            }
57189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee            call = calls.getVideoUpgradeRequestCall();
585468d9beac7c4e9efe3dfe25a74c87ff94a0f9efPrerepa Viswanadham            Log.d(this, "getVideoUpgradeRequestCall call =" + call);
59d0f2cf0c175451321f8395b57c48571d1a5c9a0fAndrew Lee            if (call != null) {
60189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee                processVideoUpgradeRequestCall(call);
61189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee            }
62189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee        } else {
63189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee            // This is necessary because the activity can be destroyed while an incoming call exists.
64189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee            // This happens when back button is pressed while incoming call is still being shown.
65189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee            if (mCallId != null) {
66189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee                CallList.getInstance().removeCallUpdateListener(mCallId, this);
67189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee            }
680b03b7a58d1e1432a8380c2bfc72b3a425fd6646Chiao Cheng        }
690b03b7a58d1e1432a8380c2bfc72b3a425fd6646Chiao Cheng    }
700b03b7a58d1e1432a8380c2bfc72b3a425fd6646Chiao Cheng
710b03b7a58d1e1432a8380c2bfc72b3a425fd6646Chiao Cheng    @Override
72189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee    public void onIncomingCall(InCallState oldState, InCallState newState, Call call) {
73871698737d5d9fdd878ead5399da465f0d887924Christine Chen        Log.d(this, "onIncomingCall: " + this);
74e9c6c1ba7262093ff199df81d3e6b74dd83f1103Yorke Lee        Call modifyCall = CallList.getInstance().getVideoUpgradeRequestCall();
75e9c6c1ba7262093ff199df81d3e6b74dd83f1103Yorke Lee        if (modifyCall != null) {
76e9c6c1ba7262093ff199df81d3e6b74dd83f1103Yorke Lee            showAnswerUi(false);
77e9c6c1ba7262093ff199df81d3e6b74dd83f1103Yorke Lee            Log.d(this, "declining upgrade request id: ");
78e9c6c1ba7262093ff199df81d3e6b74dd83f1103Yorke Lee            CallList.getInstance().removeCallUpdateListener(mCallId, this);
79e9c6c1ba7262093ff199df81d3e6b74dd83f1103Yorke Lee            InCallPresenter.getInstance().declineUpgradeRequest(getUi().getContext());
80e9c6c1ba7262093ff199df81d3e6b74dd83f1103Yorke Lee        }
81e9c6c1ba7262093ff199df81d3e6b74dd83f1103Yorke Lee        if (!call.getId().equals(mCallId)) {
82e9c6c1ba7262093ff199df81d3e6b74dd83f1103Yorke Lee            // A new call is coming in.
83e9c6c1ba7262093ff199df81d3e6b74dd83f1103Yorke Lee            processIncomingCall(call);
848b6c8d0dbfba6eabe3d835f8cdcec8a13e253d0cChiao Cheng        }
858b6c8d0dbfba6eabe3d835f8cdcec8a13e253d0cChiao Cheng    }
868b6c8d0dbfba6eabe3d835f8cdcec8a13e253d0cChiao Cheng
87a45890b8f8cd7d56e2f7f756788d9855eb5b0bc4Prerepa Viswanadham    @Override
88a45890b8f8cd7d56e2f7f756788d9855eb5b0bc4Prerepa Viswanadham    public void onIncomingCall(Call call) {
89a45890b8f8cd7d56e2f7f756788d9855eb5b0bc4Prerepa Viswanadham    }
90a45890b8f8cd7d56e2f7f756788d9855eb5b0bc4Prerepa Viswanadham
91a45890b8f8cd7d56e2f7f756788d9855eb5b0bc4Prerepa Viswanadham    @Override
92a45890b8f8cd7d56e2f7f756788d9855eb5b0bc4Prerepa Viswanadham    public void onCallListChange(CallList list) {
93a45890b8f8cd7d56e2f7f756788d9855eb5b0bc4Prerepa Viswanadham    }
94a45890b8f8cd7d56e2f7f756788d9855eb5b0bc4Prerepa Viswanadham
95a45890b8f8cd7d56e2f7f756788d9855eb5b0bc4Prerepa Viswanadham    @Override
96a45890b8f8cd7d56e2f7f756788d9855eb5b0bc4Prerepa Viswanadham    public void onDisconnect(Call call) {
97a45890b8f8cd7d56e2f7f756788d9855eb5b0bc4Prerepa Viswanadham        // no-op
98a45890b8f8cd7d56e2f7f756788d9855eb5b0bc4Prerepa Viswanadham    }
99e9c6c1ba7262093ff199df81d3e6b74dd83f1103Yorke Lee
1001a723f1586c812510bd0791a4ef8420d36f83cf9Tyler Gunn    public void onSessionModificationStateChange(int sessionModificationState) {
1011a723f1586c812510bd0791a4ef8420d36f83cf9Tyler Gunn        boolean isUpgradePending = sessionModificationState ==
1021a723f1586c812510bd0791a4ef8420d36f83cf9Tyler Gunn                Call.SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST;
1031a723f1586c812510bd0791a4ef8420d36f83cf9Tyler Gunn
1041a723f1586c812510bd0791a4ef8420d36f83cf9Tyler Gunn        if (!isUpgradePending) {
1051a723f1586c812510bd0791a4ef8420d36f83cf9Tyler Gunn            // Stop listening for updates.
1061a723f1586c812510bd0791a4ef8420d36f83cf9Tyler Gunn            CallList.getInstance().removeCallUpdateListener(mCallId, this);
1071a723f1586c812510bd0791a4ef8420d36f83cf9Tyler Gunn            showAnswerUi(false);
1081a723f1586c812510bd0791a4ef8420d36f83cf9Tyler Gunn        }
1091a723f1586c812510bd0791a4ef8420d36f83cf9Tyler Gunn    }
110a45890b8f8cd7d56e2f7f756788d9855eb5b0bc4Prerepa Viswanadham
1118bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar    private boolean isVideoUpgradePending(Call call) {
1128bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar        return call.getSessionModificationState()
1138bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar                == Call.SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST;
1148bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar    }
1158bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar
1168bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar    @Override
1178bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar    public void onUpgradeToVideo(Call call) {
1188bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar        Log.d(this, "onUpgradeToVideo: " + this + " call=" + call);
1198bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar        if (getUi() == null) {
1208bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar            Log.d(this, "onUpgradeToVideo ui is null");
1218bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar            return;
1228bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar        }
1238bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar        boolean isUpgradePending = isVideoUpgradePending(call);
1248bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar        InCallPresenter inCallPresenter = InCallPresenter.getInstance();
1258bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar        if (isUpgradePending
1268bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar                && inCallPresenter.getInCallState() == InCallPresenter.InCallState.INCOMING) {
1278bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar            Log.d(this, "declining upgrade request");
1288bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar            //If there is incoming call reject upgrade request
1298bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar            inCallPresenter.declineUpgradeRequest(getUi().getContext());
1308bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar        } else if (isUpgradePending) {
1318bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar            Log.d(this, "process upgrade request as no MT call");
1328bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar            processVideoUpgradeRequestCall(call);
1338bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar        }
1348bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar    }
1358bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar
1368b6c8d0dbfba6eabe3d835f8cdcec8a13e253d0cChiao Cheng    private void processIncomingCall(Call call) {
137df06e232852a93d8238f3cacaab4d704de7e1216Ihab Awad        mCallId = call.getId();
138647462d7ca1cfaf28c76d573bd9a4e11d493a623Christine Chen        mCall = call;
139bcceccb84a73f1fa045180b8e61ad6595211f721Santos Cordon
140bcceccb84a73f1fa045180b8e61ad6595211f721Santos Cordon        // Listen for call updates for the current call.
141bcceccb84a73f1fa045180b8e61ad6595211f721Santos Cordon        CallList.getInstance().addCallUpdateListener(mCallId, this);
142bcceccb84a73f1fa045180b8e61ad6595211f721Santos Cordon
143871698737d5d9fdd878ead5399da465f0d887924Christine Chen        Log.d(TAG, "Showing incoming for call id: " + mCallId + " " + this);
144189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee        if (showAnswerUi(true)) {
145189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee            final List<String> textMsgs = CallList.getInstance().getTextResponses(call.getId());
146189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee            configureAnswerTargetsForSms(call, textMsgs);
147189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee        }
148189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee    }
149189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee
150189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee    private boolean showAnswerUi(boolean show) {
151189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee        final InCallActivity activity = InCallPresenter.getInstance().getActivity();
152189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee        if (activity != null) {
153189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee            activity.showAnswerFragment(show);
1546176020b6ce9e9e28d6c2ae80f13313c75615492Yorke Lee            if (getUi() != null) {
1556176020b6ce9e9e28d6c2ae80f13313c75615492Yorke Lee                getUi().onShowAnswerUi(show);
1566176020b6ce9e9e28d6c2ae80f13313c75615492Yorke Lee            }
157189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee            return true;
158189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee        } else {
159189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee            return false;
160189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee        }
1618b6c8d0dbfba6eabe3d835f8cdcec8a13e253d0cChiao Cheng    }
1628b6c8d0dbfba6eabe3d835f8cdcec8a13e253d0cChiao Cheng
163fe4982c221c8ee734afedc4d005661d9c6c1ac31Andrew Lee    private void processVideoUpgradeRequestCall(Call call) {
1648bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar        Log.d(this, " processVideoUpgradeRequestCall call=" + call);
165fe4982c221c8ee734afedc4d005661d9c6c1ac31Andrew Lee        mCallId = call.getId();
166fe4982c221c8ee734afedc4d005661d9c6c1ac31Andrew Lee        mCall = call;
167fe4982c221c8ee734afedc4d005661d9c6c1ac31Andrew Lee
168fe4982c221c8ee734afedc4d005661d9c6c1ac31Andrew Lee        // Listen for call updates for the current call.
169fe4982c221c8ee734afedc4d005661d9c6c1ac31Andrew Lee        CallList.getInstance().addCallUpdateListener(mCallId, this);
170fe4982c221c8ee734afedc4d005661d9c6c1ac31Andrew Lee
1718bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar        final int currentVideoState = call.getVideoState();
1728bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar        final int modifyToVideoState = call.getModifyToVideoState();
1738bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar
1748bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar        if (currentVideoState == modifyToVideoState) {
1758bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar            Log.w(this, "processVideoUpgradeRequestCall: Video states are same. Return.");
1768bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar            return;
1778bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar        }
1788bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar
1791a723f1586c812510bd0791a4ef8420d36f83cf9Tyler Gunn        AnswerUi ui = getUi();
1808bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar
1811a723f1586c812510bd0791a4ef8420d36f83cf9Tyler Gunn        if (ui == null) {
1821a723f1586c812510bd0791a4ef8420d36f83cf9Tyler Gunn            Log.e(this, "Ui is null. Can't process upgrade request");
1831a723f1586c812510bd0791a4ef8420d36f83cf9Tyler Gunn            return;
1848bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar        }
1851a723f1586c812510bd0791a4ef8420d36f83cf9Tyler Gunn        showAnswerUi(true);
1861a723f1586c812510bd0791a4ef8420d36f83cf9Tyler Gunn        ui.showTargets(AnswerFragment.TARGET_SET_FOR_VIDEO_ACCEPT_REJECT_REQUEST,
1871a723f1586c812510bd0791a4ef8420d36f83cf9Tyler Gunn                modifyToVideoState);
1888bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar    }
1898bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar
1908bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar    private boolean isEnabled(int videoState, int mask) {
1918bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar        return (videoState & mask) == mask;
192fe4982c221c8ee734afedc4d005661d9c6c1ac31Andrew Lee    }
193fe4982c221c8ee734afedc4d005661d9c6c1ac31Andrew Lee
1948b6c8d0dbfba6eabe3d835f8cdcec8a13e253d0cChiao Cheng    @Override
1957b2d519fe9e74a12d4e09aa212e6be46627674aaIhab Awad    public void onCallChanged(Call call) {
196871698737d5d9fdd878ead5399da465f0d887924Christine Chen        Log.d(this, "onCallStateChange() " + call + " " + this);
1973034f16f6b74004738ca8e85cefc3f503679f44fYorke Lee        if (call.getState() != Call.State.INCOMING) {
1988bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar            boolean isUpgradePending = isVideoUpgradePending(call);
1998bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar            if (!isUpgradePending) {
2008bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar                // Stop listening for updates.
2018bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar                CallList.getInstance().removeCallUpdateListener(mCallId, this);
2028bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar            }
2038b6c8d0dbfba6eabe3d835f8cdcec8a13e253d0cChiao Cheng
2048bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar            final Call incall = CallList.getInstance().getIncomingCall();
2058bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar            if (incall != null || isUpgradePending) {
2065468d9beac7c4e9efe3dfe25a74c87ff94a0f9efPrerepa Viswanadham                showAnswerUi(true);
2078bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar            } else {
2085468d9beac7c4e9efe3dfe25a74c87ff94a0f9efPrerepa Viswanadham                showAnswerUi(false);
2098bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar            }
210647462d7ca1cfaf28c76d573bd9a4e11d493a623Christine Chen
2113034f16f6b74004738ca8e85cefc3f503679f44fYorke Lee            mHasTextMessages = false;
2123034f16f6b74004738ca8e85cefc3f503679f44fYorke Lee        } else if (!mHasTextMessages) {
2133034f16f6b74004738ca8e85cefc3f503679f44fYorke Lee            final List<String> textMsgs = CallList.getInstance().getTextResponses(call.getId());
2143034f16f6b74004738ca8e85cefc3f503679f44fYorke Lee            if (textMsgs != null) {
2153034f16f6b74004738ca8e85cefc3f503679f44fYorke Lee                configureAnswerTargetsForSms(call, textMsgs);
2163034f16f6b74004738ca8e85cefc3f503679f44fYorke Lee            }
217671b221ccadea34fb9327ef5342b26419eb5ca99Santos Cordon        }
218671b221ccadea34fb9327ef5342b26419eb5ca99Santos Cordon    }
219671b221ccadea34fb9327ef5342b26419eb5ca99Santos Cordon
220fe4982c221c8ee734afedc4d005661d9c6c1ac31Andrew Lee    public void onAnswer(int videoState, Context context) {
2216af0c61c32da6cfb400168ae3b0cf9f802abfed4Sailesh Nepal        if (mCallId == null) {
222e286f91abd12dee037de19c3836d8002e450a9c9Santos Cordon            return;
223e286f91abd12dee037de19c3836d8002e450a9c9Santos Cordon        }
224e286f91abd12dee037de19c3836d8002e450a9c9Santos Cordon
225fe4982c221c8ee734afedc4d005661d9c6c1ac31Andrew Lee        if (mCall.getSessionModificationState()
226fe4982c221c8ee734afedc4d005661d9c6c1ac31Andrew Lee                == Call.SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST) {
2271a723f1586c812510bd0791a4ef8420d36f83cf9Tyler Gunn            Log.d(this, "onAnswer (upgradeCall) mCallId=" + mCallId + " videoState=" + videoState);
2288bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar            InCallPresenter.getInstance().acceptUpgradeRequest(videoState, context);
229fe4982c221c8ee734afedc4d005661d9c6c1ac31Andrew Lee        } else {
2301a723f1586c812510bd0791a4ef8420d36f83cf9Tyler Gunn            Log.d(this, "onAnswer (answerCall) mCallId=" + mCallId + " videoState=" + videoState);
2316cddf46812634fadc194830774110780f14e9462Tyler Gunn            TelecomAdapter.getInstance().answerCall(mCall.getId(), videoState);
232fe4982c221c8ee734afedc4d005661d9c6c1ac31Andrew Lee        }
233dba5a7df121b4904b94e14439cca8996d843c1c9Chiao Cheng    }
234dba5a7df121b4904b94e14439cca8996d843c1c9Chiao Cheng
235e553d43bc397e769a8ad416e3a4f9515d6da8ebaSantos Cordon    /**
23612947a3d7ca33792fabf594b413c1e9a4b8235bfSantos Cordon     * TODO: We are using reject and decline interchangeably. We should settle on
237e553d43bc397e769a8ad416e3a4f9515d6da8ebaSantos Cordon     * reject since it seems to be more prevalent.
238e553d43bc397e769a8ad416e3a4f9515d6da8ebaSantos Cordon     */
2398bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar    public void onDecline(Context context) {
2408b6c8d0dbfba6eabe3d835f8cdcec8a13e253d0cChiao Cheng        Log.d(this, "onDecline " + mCallId);
2418bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar        if (mCall.getSessionModificationState()
2428bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar                == Call.SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST) {
2438bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar            InCallPresenter.getInstance().declineUpgradeRequest(context);
2448bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar        } else {
2458bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar            TelecomAdapter.getInstance().rejectCall(mCall.getId(), false, null);
2468bef461247ec597f4fbbc604ee6e37fbdbc27d1eRekha Kumar        }
247dba5a7df121b4904b94e14439cca8996d843c1c9Chiao Cheng    }
248dba5a7df121b4904b94e14439cca8996d843c1c9Chiao Cheng
249dba5a7df121b4904b94e14439cca8996d843c1c9Chiao Cheng    public void onText() {
25054601f653bb8cc6b37b56b8de6515a2d6aa9fbb1Christine Chen        if (getUi() != null) {
251a064920e8e428d73dc89484ad80cd27985df96d5Yorke Lee            TelecomUtil.silenceRinger(getUi().getContext());
252ef1b5e0afd8e824979d1acda015eda314e61955bDavid Braun            getUi().showMessageDialog();
25354601f653bb8cc6b37b56b8de6515a2d6aa9fbb1Christine Chen        }
25410196fd2f7cc922693e2a7c6c932725a52157943Christine Chen    }
25510196fd2f7cc922693e2a7c6c932725a52157943Christine Chen
25610196fd2f7cc922693e2a7c6c932725a52157943Christine Chen    public void rejectCallWithMessage(String message) {
2571a7f2bcab2d2023f2ee4cfb0bc57bc265b5aab87Chiao Cheng        Log.d(this, "sendTextToDefaultActivity()...");
2586cddf46812634fadc194830774110780f14e9462Tyler Gunn        TelecomAdapter.getInstance().rejectCall(mCall.getId(), true, message);
259647462d7ca1cfaf28c76d573bd9a4e11d493a623Christine Chen
260647462d7ca1cfaf28c76d573bd9a4e11d493a623Christine Chen        onDismissDialog();
261647462d7ca1cfaf28c76d573bd9a4e11d493a623Christine Chen    }
262647462d7ca1cfaf28c76d573bd9a4e11d493a623Christine Chen
263647462d7ca1cfaf28c76d573bd9a4e11d493a623Christine Chen    public void onDismissDialog() {
264647462d7ca1cfaf28c76d573bd9a4e11d493a623Christine Chen        InCallPresenter.getInstance().onDismissDialog();
265dba5a7df121b4904b94e14439cca8996d843c1c9Chiao Cheng    }
2667df3ac3f95c9d23396e1319beb6ca34435d965f5Chiao Cheng
2673034f16f6b74004738ca8e85cefc3f503679f44fYorke Lee    private void configureAnswerTargetsForSms(Call call, List<String> textMsgs) {
268599477afdf26bee779515ead4638effea8d6beaaYorke Lee        if (getUi() == null) {
269599477afdf26bee779515ead4638effea8d6beaaYorke Lee            return;
270599477afdf26bee779515ead4638effea8d6beaaYorke Lee        }
2713034f16f6b74004738ca8e85cefc3f503679f44fYorke Lee        mHasTextMessages = textMsgs != null;
272737f56760b617688aac7218021a5e615ed750810Ihab Awad        boolean withSms =
273737f56760b617688aac7218021a5e615ed750810Ihab Awad                call.can(android.telecom.Call.Details.CAPABILITY_RESPOND_VIA_TEXT)
274737f56760b617688aac7218021a5e615ed750810Ihab Awad                && mHasTextMessages;
275eb019fc0807fbf1aafff8afbca4e7491fc2944e7Tyler Gunn
276eb019fc0807fbf1aafff8afbca4e7491fc2944e7Tyler Gunn        // Only present the user with the option to answer as a video call if the incoming call is
277eb019fc0807fbf1aafff8afbca4e7491fc2944e7Tyler Gunn        // a bi-directional video call.
278f66b7ca229eccd343bdffa8591aaa4ab6395488eTyler Gunn        if (VideoProfile.isBidirectional((call.getVideoState()))) {
27904746eec88c92d9130168455432db6f0cf9db04cYorke Lee            if (withSms) {
2803034f16f6b74004738ca8e85cefc3f503679f44fYorke Lee                getUi().showTargets(AnswerFragment.TARGET_SET_FOR_VIDEO_WITH_SMS);
2813034f16f6b74004738ca8e85cefc3f503679f44fYorke Lee                getUi().configureMessageDialog(textMsgs);
2823034f16f6b74004738ca8e85cefc3f503679f44fYorke Lee            } else {
2833034f16f6b74004738ca8e85cefc3f503679f44fYorke Lee                getUi().showTargets(AnswerFragment.TARGET_SET_FOR_VIDEO_WITHOUT_SMS);
2843034f16f6b74004738ca8e85cefc3f503679f44fYorke Lee            }
2853034f16f6b74004738ca8e85cefc3f503679f44fYorke Lee        } else {
28604746eec88c92d9130168455432db6f0cf9db04cYorke Lee            if (withSms) {
2873034f16f6b74004738ca8e85cefc3f503679f44fYorke Lee                getUi().showTargets(AnswerFragment.TARGET_SET_FOR_AUDIO_WITH_SMS);
2883034f16f6b74004738ca8e85cefc3f503679f44fYorke Lee                getUi().configureMessageDialog(textMsgs);
2893034f16f6b74004738ca8e85cefc3f503679f44fYorke Lee            } else {
2903034f16f6b74004738ca8e85cefc3f503679f44fYorke Lee                getUi().showTargets(AnswerFragment.TARGET_SET_FOR_AUDIO_WITHOUT_SMS);
2913034f16f6b74004738ca8e85cefc3f503679f44fYorke Lee            }
2923034f16f6b74004738ca8e85cefc3f503679f44fYorke Lee        }
2933034f16f6b74004738ca8e85cefc3f503679f44fYorke Lee    }
2943034f16f6b74004738ca8e85cefc3f503679f44fYorke Lee
295150a5c58c67f230c8fd7293b180bbf50aa761480Santos Cordon    interface AnswerUi extends Ui {
296189e1efe04d1073a2abd100eb33b267435951ff3Yorke Lee        public void onShowAnswerUi(boolean shown);
297efe6a5d64851519eea0fe9d349b7b8f904193a36Andrew Lee        public void showTargets(int targetSet);
2981a723f1586c812510bd0791a4ef8420d36f83cf9Tyler Gunn        public void showTargets(int targetSet, int videoState);
299ef1b5e0afd8e824979d1acda015eda314e61955bDavid Braun        public void showMessageDialog();
30034f735625b79f7250b72d9471fab837b90139de3Santos Cordon        public void configureMessageDialog(List<String> textResponses);
30135224e8ff0e3707b92626767f048f1bf83352a2dTyler Gunn        public Context getContext();
3027df3ac3f95c9d23396e1319beb6ca34435d965f5Chiao Cheng    }
303e286f91abd12dee037de19c3836d8002e450a9c9Santos Cordon}
304