1ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/*
2ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Copyright (C) 2016 The Android Open Source Project
3ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian *
4ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Licensed under the Apache License, Version 2.0 (the "License");
5ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * you may not use this file except in compliance with the License.
6ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * You may obtain a copy of the License at
7ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian *
8ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian *      http://www.apache.org/licenses/LICENSE-2.0
9ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian *
10ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Unless required by applicable law or agreed to in writing, software
11ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * distributed under the License is distributed on an "AS IS" BASIS,
12ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * See the License for the specific language governing permissions and
14ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * limitations under the License
15ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */
16ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
17ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpackage com.android.incallui.answer.impl;
18ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
19ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.Manifest.permission;
20ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.animation.Animator;
21ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.animation.AnimatorListenerAdapter;
22ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.animation.AnimatorSet;
23ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.animation.ObjectAnimator;
24ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.annotation.SuppressLint;
25ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.content.Context;
26ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.content.pm.PackageManager;
27ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.location.Location;
28ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.net.Uri;
29ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.os.Bundle;
30ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.os.Handler;
31ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.os.Looper;
32cf61ca00e96f7fb723ca2d4406ec24485a60acd1wangqiimport android.os.Trace;
33ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.support.annotation.DrawableRes;
34ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.support.annotation.FloatRange;
35ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.support.annotation.NonNull;
36ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.support.annotation.Nullable;
37ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.support.annotation.StringRes;
38ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.support.annotation.VisibleForTesting;
39ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.support.v4.app.Fragment;
40ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.text.TextUtils;
419779f967ebb9512e5b19090b071572c9c4f0f2a6Eric Erfanianimport android.transition.TransitionManager;
42ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.view.LayoutInflater;
43ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.view.View;
44ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.view.View.AccessibilityDelegate;
45ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.view.View.OnClickListener;
46ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.view.ViewGroup;
47ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.view.ViewTreeObserver.OnGlobalLayoutListener;
48ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.view.accessibility.AccessibilityEvent;
49ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.view.accessibility.AccessibilityNodeInfo;
50ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
51ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.widget.ImageView;
52ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.dialer.common.Assert;
53ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.dialer.common.FragmentUtils;
54ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.dialer.common.LogUtil;
55ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.dialer.common.MathUtil;
56ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.dialer.compat.ActivityCompat;
578369df095a73a77b3715f8ae7ba06089cebca4ceEric Erfanianimport com.android.dialer.logging.DialerImpression;
58ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.dialer.logging.Logger;
59ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.dialer.multimedia.MultimediaData;
6065e19075682f3c0cdaca367138560d80ac4a3106roldenburgimport com.android.dialer.telecom.TelecomUtil;
61ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.dialer.util.ViewUtil;
62ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.incallui.answer.impl.CreateCustomSmsDialogFragment.CreateCustomSmsHolder;
63ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.incallui.answer.impl.SmsBottomSheetFragment.SmsSheetHolder;
64ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.incallui.answer.impl.affordance.SwipeButtonHelper.Callback;
65ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.incallui.answer.impl.affordance.SwipeButtonView;
66ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.incallui.answer.impl.answermethod.AnswerMethod;
67ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.incallui.answer.impl.answermethod.AnswerMethodFactory;
68ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.incallui.answer.impl.answermethod.AnswerMethodHolder;
69ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.incallui.answer.impl.utils.Interpolators;
70ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.incallui.answer.protocol.AnswerScreen;
71ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.incallui.answer.protocol.AnswerScreenDelegate;
72ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.incallui.answer.protocol.AnswerScreenDelegateFactory;
73ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.incallui.call.DialerCall.State;
74ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.incallui.contactgrid.ContactGridManager;
75ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.incallui.incall.protocol.ContactPhotoType;
76ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.incallui.incall.protocol.InCallScreen;
77ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.incallui.incall.protocol.InCallScreenDelegate;
78ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.incallui.incall.protocol.InCallScreenDelegateFactory;
79ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.incallui.incall.protocol.PrimaryCallState;
80ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.incallui.incall.protocol.PrimaryInfo;
81ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.incallui.incall.protocol.SecondaryInfo;
828efb49584f732014076390093ad90e23dce2e3batwyenimport com.android.incallui.incalluilock.InCallUiLock;
83d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport com.android.incallui.maps.MapsComponent;
84ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.incallui.sessiondata.AvatarPresenter;
85ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.incallui.sessiondata.MultimediaFragment;
86ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.incallui.util.AccessibilityUtil;
87d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport com.android.incallui.video.protocol.VideoCallScreen;
889050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanianimport com.android.incallui.videotech.utils.VideoUtils;
89ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport java.util.ArrayList;
90ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport java.util.List;
91ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport java.util.Objects;
92ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
93ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/** The new version of the incoming call screen. */
94ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian@SuppressLint("ClickableViewAccessibility")
95ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpublic class AnswerFragment extends Fragment
96ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    implements AnswerScreen,
97ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        InCallScreen,
98ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        SmsSheetHolder,
99ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        CreateCustomSmsHolder,
100ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        AnswerMethodHolder,
101ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        MultimediaFragment.Holder {
102ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
103ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
104ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  static final String ARG_CALL_ID = "call_id";
105ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
106219b870aa9e9c4046ca1dd915d586010eec1b69fwangqi  static final String ARG_IS_RTT_CALL = "is_rtt_call";
107219b870aa9e9c4046ca1dd915d586010eec1b69fwangqi
108ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
109d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  static final String ARG_IS_VIDEO_CALL = "is_video_call";
110ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
1119050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian  static final String ARG_ALLOW_ANSWER_AND_RELEASE = "allow_answer_and_release";
1129050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian
1139050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian  static final String ARG_HAS_CALL_ON_HOLD = "has_call_on_hold";
1149050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian
115ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
116ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  static final String ARG_IS_VIDEO_UPGRADE_REQUEST = "is_video_upgrade_request";
117ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
118fc37b02f5d3381a7882770941e461b13b679b6efEric Erfanian  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
119fc37b02f5d3381a7882770941e461b13b679b6efEric Erfanian  static final String ARG_IS_SELF_MANAGED_CAMERA = "is_self_managed_camera";
120fc37b02f5d3381a7882770941e461b13b679b6efEric Erfanian
121ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private static final String STATE_HAS_ANIMATED_ENTRY = "hasAnimated";
122ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
123ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private static final int HINT_SECONDARY_SHOW_DURATION_MILLIS = 5000;
124ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private static final float ANIMATE_LERP_PROGRESS = 0.5f;
125ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private static final int STATUS_BAR_DISABLE_RECENT = 0x01000000;
126ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private static final int STATUS_BAR_DISABLE_HOME = 0x00200000;
127ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private static final int STATUS_BAR_DISABLE_BACK = 0x00400000;
128ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
129ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private static void fadeToward(View view, float newAlpha) {
130ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    view.setAlpha(MathUtil.lerp(view.getAlpha(), newAlpha, ANIMATE_LERP_PROGRESS));
131ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
132ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
133ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private static void scaleToward(View view, float newScale) {
134ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    view.setScaleX(MathUtil.lerp(view.getScaleX(), newScale, ANIMATE_LERP_PROGRESS));
135ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    view.setScaleY(MathUtil.lerp(view.getScaleY(), newScale, ANIMATE_LERP_PROGRESS));
136ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
137ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
138ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private AnswerScreenDelegate answerScreenDelegate;
139ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private InCallScreenDelegate inCallScreenDelegate;
140ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
141ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private View importanceBadge;
142ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private SwipeButtonView secondaryButton;
1439050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian  private SwipeButtonView answerAndReleaseButton;
144ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private AffordanceHolderLayout affordanceHolderLayout;
145ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  // Use these flags to prevent user from clicking accept/reject buttons multiple times.
146ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  // We use separate flags because in some rare cases accepting a call may fail to join the room,
147ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  // and then user is stuck in the incoming call view until it times out. Two flags at least give
148ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  // the user a chance to get out of the CallActivity.
149ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private boolean buttonAcceptClicked;
150ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private boolean buttonRejectClicked;
151ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private boolean hasAnimatedEntry;
152f94391034e9d591c18d04c0b796d944938201f6aAndroid Dialer  private PrimaryInfo primaryInfo = PrimaryInfo.empty();
153ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private PrimaryCallState primaryCallState;
154ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private ArrayList<CharSequence> textResponses;
155ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private SmsBottomSheetFragment textResponsesFragment;
156ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private CreateCustomSmsDialogFragment createCustomSmsDialogFragment;
157ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private SecondaryBehavior secondaryBehavior = SecondaryBehavior.REJECT_WITH_SMS;
1589050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian  private SecondaryBehavior answerAndReleaseBehavior;
159ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private ContactGridManager contactGridManager;
160d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  private VideoCallScreen answerVideoCallScreen;
161ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private Handler handler = new Handler(Looper.getMainLooper());
162ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
163ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private enum SecondaryBehavior {
164ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    REJECT_WITH_SMS(
165ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        R.drawable.quantum_ic_message_white_24,
166ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        R.string.a11y_description_incoming_call_reject_with_sms,
167ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        R.string.a11y_incoming_call_reject_with_sms,
168ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        R.string.call_incoming_swipe_to_decline_with_message) {
169ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      @Override
170ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      public void performAction(AnswerFragment fragment) {
171ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        fragment.showMessageMenu();
172ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      }
173ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    },
174ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
175ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    ANSWER_VIDEO_AS_AUDIO(
176ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        R.drawable.quantum_ic_videocam_off_white_24,
177ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        R.string.a11y_description_incoming_call_answer_video_as_audio,
178ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        R.string.a11y_incoming_call_answer_video_as_audio,
179ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        R.string.call_incoming_swipe_to_answer_video_as_audio) {
180ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      @Override
181ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      public void performAction(AnswerFragment fragment) {
182ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        fragment.acceptCallByUser(true /* answerVideoAsAudio */);
183ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      }
1849050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian    },
1859050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian
1869050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian    ANSWER_AND_RELEASE(
1879050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian        R.drawable.ic_end_answer_32,
1889050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian        R.string.a11y_description_incoming_call_answer_and_release,
1899050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian        R.string.a11y_incoming_call_answer_and_release,
1909050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian        R.string.call_incoming_swipe_to_answer_and_release) {
1919050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian      @Override
1929050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian      public void performAction(AnswerFragment fragment) {
1939050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian        fragment.performAnswerAndRelease();
1949050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian      }
195ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    };
196ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
197ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    @DrawableRes public final int icon;
198ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    @StringRes public final int contentDescription;
199ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    @StringRes public final int accessibilityLabel;
200ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    @StringRes public final int hintText;
201ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
202ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    SecondaryBehavior(
203ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        @DrawableRes int icon,
204ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        @StringRes int contentDescription,
205ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        @StringRes int accessibilityLabel,
206ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        @StringRes int hintText) {
207ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      this.icon = icon;
208ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      this.contentDescription = contentDescription;
209ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      this.accessibilityLabel = accessibilityLabel;
210ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      this.hintText = hintText;
211ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
212ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
213ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    public abstract void performAction(AnswerFragment fragment);
214ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
215ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    public void applyToView(ImageView view) {
216ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      view.setImageResource(icon);
217ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      view.setContentDescription(view.getContext().getText(contentDescription));
218ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
219ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
220ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
2219050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian  private void performAnswerAndRelease() {
2229050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian    restoreAnswerAndReleaseButtonAnimation();
2239050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian    answerScreenDelegate.onAnswerAndReleaseCall();
2242ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian    buttonAcceptClicked = true;
2259050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian  }
2269050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian
2279050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian  private void restoreAnswerAndReleaseButtonAnimation() {
2289050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian    answerAndReleaseButton
2299050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian        .animate()
2309050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian        .alpha(0)
2319050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian        .withEndAction(
2329050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian            new Runnable() {
2339050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian              @Override
2349050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian              public void run() {
2359050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian                affordanceHolderLayout.reset(false);
2369050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian                secondaryButton.animate().alpha(1);
2379050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian              }
2389050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian            });
2399050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian  }
2409050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian
2419050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian  private final AccessibilityDelegate accessibilityDelegate =
242ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      new AccessibilityDelegate() {
243ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        @Override
244ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
245ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          super.onInitializeAccessibilityNodeInfo(host, info);
246ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          if (host == secondaryButton) {
247ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian            CharSequence label = getText(secondaryBehavior.accessibilityLabel);
248ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian            info.addAction(new AccessibilityAction(AccessibilityNodeInfo.ACTION_CLICK, label));
2499050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian          } else if (host == answerAndReleaseButton) {
2509050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian            CharSequence label = getText(answerAndReleaseBehavior.accessibilityLabel);
2519050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian            info.addAction(new AccessibilityAction(AccessibilityNodeInfo.ACTION_CLICK, label));
252ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          }
253ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        }
254ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
255ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        @Override
256ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        public boolean performAccessibilityAction(View host, int action, Bundle args) {
257ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          if (action == AccessibilityNodeInfo.ACTION_CLICK) {
258ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian            if (host == secondaryButton) {
259ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian              performSecondaryButtonAction();
260ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian              return true;
2619050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian            } else if (host == answerAndReleaseButton) {
2629050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian              performAnswerAndReleaseButtonAction();
2639050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian              return true;
264ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian            }
265ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          }
266ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          return super.performAccessibilityAction(host, action, args);
267ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        }
268ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      };
269ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
2709050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian  private final Callback affordanceCallback =
271ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      new Callback() {
272ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        @Override
273ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        public void onAnimationToSideStarted(boolean rightPage, float translation, float vel) {}
274ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
275ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        @Override
2769050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian        public void onAnimationToSideEnded(boolean rightPage) {
2779050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian          if (rightPage) {
2789050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian            performAnswerAndReleaseButtonAction();
2799050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian          } else {
2809050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian            performSecondaryButtonAction();
2819050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian          }
282ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        }
283ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
284ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        @Override
285ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        public float getMaxTranslationDistance() {
286ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          View view = getView();
287ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          if (view == null) {
288ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian            return 0;
289ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          }
290ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          return (float) Math.hypot(view.getWidth(), view.getHeight());
291ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        }
292ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
293ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        @Override
294ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        public void onSwipingStarted(boolean rightIcon) {}
295ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
296ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        @Override
297ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        public void onSwipingAborted() {}
298ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
299ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        @Override
300ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        public void onIconClicked(boolean rightIcon) {
301ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          affordanceHolderLayout.startHintAnimation(rightIcon, null);
3029050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian          getAnswerMethod()
3039050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian              .setHintText(
3049050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian                  rightIcon
3059050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian                      ? getText(answerAndReleaseBehavior.hintText)
3069050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian                      : getText(secondaryBehavior.hintText));
307ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          handler.removeCallbacks(swipeHintRestoreTimer);
308ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          handler.postDelayed(swipeHintRestoreTimer, HINT_SECONDARY_SHOW_DURATION_MILLIS);
309ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        }
310ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
311ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        @Override
312ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        public SwipeButtonView getLeftIcon() {
313ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          return secondaryButton;
314ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        }
315ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
316ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        @Override
317ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        public SwipeButtonView getRightIcon() {
3189050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian          return answerAndReleaseButton;
319ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        }
320ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
321ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        @Override
322ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        public View getLeftPreview() {
323ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          return null;
324ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        }
325ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
326ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        @Override
327ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        public View getRightPreview() {
328ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          return null;
329ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        }
330ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
331ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        @Override
332ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        public float getAffordanceFalsingFactor() {
333ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          return 1.0f;
334ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        }
335ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      };
336ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
3379050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian  private Runnable swipeHintRestoreTimer = this::restoreSwipeHintTexts;
338ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
339ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private void performSecondaryButtonAction() {
340ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    secondaryBehavior.performAction(this);
341ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
342ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
3439050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian  private void performAnswerAndReleaseButtonAction() {
3449050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian    answerAndReleaseBehavior.performAction(this);
3459050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian  }
3469050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian
347ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public static AnswerFragment newInstance(
348fc37b02f5d3381a7882770941e461b13b679b6efEric Erfanian      String callId,
349219b870aa9e9c4046ca1dd915d586010eec1b69fwangqi      boolean isRttCall,
350fc37b02f5d3381a7882770941e461b13b679b6efEric Erfanian      boolean isVideoCall,
351fc37b02f5d3381a7882770941e461b13b679b6efEric Erfanian      boolean isVideoUpgradeRequest,
3529050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian      boolean isSelfManagedCamera,
3539050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian      boolean allowAnswerAndRelease,
3549050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian      boolean hasCallOnHold) {
355ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    Bundle bundle = new Bundle();
356ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    bundle.putString(ARG_CALL_ID, Assert.isNotNull(callId));
357219b870aa9e9c4046ca1dd915d586010eec1b69fwangqi    bundle.putBoolean(ARG_IS_RTT_CALL, isRttCall);
358d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    bundle.putBoolean(ARG_IS_VIDEO_CALL, isVideoCall);
359ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    bundle.putBoolean(ARG_IS_VIDEO_UPGRADE_REQUEST, isVideoUpgradeRequest);
360fc37b02f5d3381a7882770941e461b13b679b6efEric Erfanian    bundle.putBoolean(ARG_IS_SELF_MANAGED_CAMERA, isSelfManagedCamera);
3619050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian    bundle.putBoolean(ARG_ALLOW_ANSWER_AND_RELEASE, allowAnswerAndRelease);
3629050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian    bundle.putBoolean(ARG_HAS_CALL_ON_HOLD, hasCallOnHold);
363ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
364ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    AnswerFragment instance = new AnswerFragment();
365ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    instance.setArguments(bundle);
366ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return instance;
367ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
368ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
369ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
3702ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian  public boolean isActionTimeout() {
3712ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian    return (buttonAcceptClicked || buttonRejectClicked) && answerScreenDelegate.isActionTimeout();
3722ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian  }
3732ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian
3742ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian  @Override
375ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @NonNull
376ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public String getCallId() {
377ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return Assert.isNotNull(getArguments().getString(ARG_CALL_ID));
378ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
379ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
380ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
381ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public boolean isVideoUpgradeRequest() {
382ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return getArguments().getBoolean(ARG_IS_VIDEO_UPGRADE_REQUEST);
383ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
384ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
385ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
386ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void setTextResponses(List<String> textResponses) {
387d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    if (isVideoCall() || isVideoUpgradeRequest()) {
388ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      LogUtil.i("AnswerFragment.setTextResponses", "no-op for video calls");
389ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    } else if (textResponses == null) {
390ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      LogUtil.i("AnswerFragment.setTextResponses", "no text responses, hiding secondary button");
391ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      this.textResponses = null;
392ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      secondaryButton.setVisibility(View.INVISIBLE);
393ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    } else if (ActivityCompat.isInMultiWindowMode(getActivity())) {
394ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      LogUtil.i("AnswerFragment.setTextResponses", "in multiwindow, hiding secondary button");
395ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      this.textResponses = null;
396ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      secondaryButton.setVisibility(View.INVISIBLE);
397ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    } else {
398ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      LogUtil.i("AnswerFragment.setTextResponses", "textResponses.size: " + textResponses.size());
3999050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian      this.textResponses = new ArrayList<>(textResponses);
400ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      secondaryButton.setVisibility(View.VISIBLE);
401ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
402ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
403ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
404ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private void initSecondaryButton() {
405ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    secondaryBehavior =
406d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian        isVideoCall() || isVideoUpgradeRequest()
407d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian            ? SecondaryBehavior.ANSWER_VIDEO_AS_AUDIO
408d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian            : SecondaryBehavior.REJECT_WITH_SMS;
409ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    secondaryBehavior.applyToView(secondaryButton);
410ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
411ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    secondaryButton.setOnClickListener(
412ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        new OnClickListener() {
413ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          @Override
414ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          public void onClick(View v) {
415ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian            performSecondaryButtonAction();
416ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          }
417ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        });
418ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    secondaryButton.setClickable(AccessibilityUtil.isAccessibilityEnabled(getContext()));
419ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    secondaryButton.setFocusable(AccessibilityUtil.isAccessibilityEnabled(getContext()));
420ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    secondaryButton.setAccessibilityDelegate(accessibilityDelegate);
421ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
422fc37b02f5d3381a7882770941e461b13b679b6efEric Erfanian    if (isVideoUpgradeRequest()) {
423d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      secondaryButton.setVisibility(View.INVISIBLE);
424fc37b02f5d3381a7882770941e461b13b679b6efEric Erfanian    } else if (isVideoCall()) {
425fc37b02f5d3381a7882770941e461b13b679b6efEric Erfanian      secondaryButton.setVisibility(View.VISIBLE);
426ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
4279050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian
4289050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian    answerAndReleaseBehavior = SecondaryBehavior.ANSWER_AND_RELEASE;
4299050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian    answerAndReleaseBehavior.applyToView(answerAndReleaseButton);
4309050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian    answerAndReleaseButton.setOnClickListener(
4319050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian        new OnClickListener() {
4329050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian          @Override
4339050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian          public void onClick(View v) {
4349050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian            performAnswerAndReleaseButtonAction();
4359050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian          }
4369050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian        });
4379050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian    answerAndReleaseButton.setClickable(AccessibilityUtil.isAccessibilityEnabled(getContext()));
4389050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian    answerAndReleaseButton.setFocusable(AccessibilityUtil.isAccessibilityEnabled(getContext()));
4399050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian    answerAndReleaseButton.setAccessibilityDelegate(accessibilityDelegate);
4409050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian
4419050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian    if (allowAnswerAndRelease()) {
4429050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian      answerAndReleaseButton.setVisibility(View.VISIBLE);
4432ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian      answerScreenDelegate.onAnswerAndReleaseButtonEnabled();
4449050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian    } else {
4459050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian      answerAndReleaseButton.setVisibility(View.INVISIBLE);
4462ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian      answerScreenDelegate.onAnswerAndReleaseButtonDisabled();
4479050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian    }
4489050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian  }
4499050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian
4509050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian  @Override
4519050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian  public boolean allowAnswerAndRelease() {
4529050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian    return getArguments().getBoolean(ARG_ALLOW_ANSWER_AND_RELEASE);
4539050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian  }
4549050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian
4559050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian  private boolean hasCallOnHold() {
4569050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian    return getArguments().getBoolean(ARG_HAS_CALL_ON_HOLD);
457ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
458ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
459ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
460ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public boolean hasPendingDialogs() {
461ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    boolean hasPendingDialogs =
462ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        textResponsesFragment != null || createCustomSmsDialogFragment != null;
463ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    LogUtil.i("AnswerFragment.hasPendingDialogs", "" + hasPendingDialogs);
464ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return hasPendingDialogs;
465ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
466ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
467ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
468ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void dismissPendingDialogs() {
469ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    LogUtil.i("AnswerFragment.dismissPendingDialogs", null);
470ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (textResponsesFragment != null) {
471ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      textResponsesFragment.dismiss();
472ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      textResponsesFragment = null;
473ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
474ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
475ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (createCustomSmsDialogFragment != null) {
476ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      createCustomSmsDialogFragment.dismiss();
477ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      createCustomSmsDialogFragment = null;
478ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
479ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
480ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
481ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
482ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public boolean isShowingLocationUi() {
483ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    Fragment fragment = getChildFragmentManager().findFragmentById(R.id.incall_location_holder);
484ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return fragment != null && fragment.isVisible();
485ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
486ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
487ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
488ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void showLocationUi(@Nullable Fragment locationUi) {
489ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    boolean isShowing = isShowingLocationUi();
490ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (!isShowing && locationUi != null) {
491ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      // Show the location fragment.
492ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      getChildFragmentManager()
493ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          .beginTransaction()
494ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          .replace(R.id.incall_location_holder, locationUi)
495ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          .commitAllowingStateLoss();
496ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    } else if (isShowing && locationUi == null) {
497ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      // Hide the location fragment
498ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      Fragment fragment = getChildFragmentManager().findFragmentById(R.id.incall_location_holder);
499ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      getChildFragmentManager().beginTransaction().remove(fragment).commitAllowingStateLoss();
500ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
501ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
502ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
503ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
504ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public Fragment getAnswerScreenFragment() {
505ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return this;
506ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
507ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
508ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private AnswerMethod getAnswerMethod() {
509ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return ((AnswerMethod)
510ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        getChildFragmentManager().findFragmentById(R.id.answer_method_container));
511ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
512ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
513ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
514ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void setPrimary(PrimaryInfo primaryInfo) {
515ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    LogUtil.i("AnswerFragment.setPrimary", primaryInfo.toString());
516ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    this.primaryInfo = primaryInfo;
517ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    updatePrimaryUI();
518ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    updateImportanceBadgeVisibility();
519ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
520ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
521ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private void updatePrimaryUI() {
522ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (getView() == null) {
523ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      return;
524ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
525ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    contactGridManager.setPrimary(primaryInfo);
526f94391034e9d591c18d04c0b796d944938201f6aAndroid Dialer    getAnswerMethod().setShowIncomingWillDisconnect(primaryInfo.answeringDisconnectsOngoingCall());
527ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    getAnswerMethod()
528ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        .setContactPhoto(
529f94391034e9d591c18d04c0b796d944938201f6aAndroid Dialer            primaryInfo.photoType() == ContactPhotoType.CONTACT ? primaryInfo.photo() : null);
530ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    updateDataFragment();
531ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
532f94391034e9d591c18d04c0b796d944938201f6aAndroid Dialer    if (primaryInfo.shouldShowLocation()) {
533ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      // Hide the avatar to make room for location
534ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      contactGridManager.setAvatarHidden(true);
535ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
536ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
537ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
538ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private void updateDataFragment() {
539ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (!isAdded()) {
540ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      return;
541ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
5422ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian    LogUtil.enterBlock("AnswerFragment.updateDataFragment");
543ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    Fragment current = getChildFragmentManager().findFragmentById(R.id.incall_data_container);
544ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    Fragment newFragment = null;
545ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
546ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    MultimediaData multimediaData = getSessionData();
547ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (multimediaData != null
548d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian        && (!TextUtils.isEmpty(multimediaData.getText())
549ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian            || (multimediaData.getImageUri() != null)
550ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian            || (multimediaData.getLocation() != null && canShowMap()))) {
551ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      // Need message fragment
552d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      String subject = multimediaData.getText();
553ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      Uri imageUri = multimediaData.getImageUri();
554ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      Location location = multimediaData.getLocation();
555ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      if (!(current instanceof MultimediaFragment)
556ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          || !Objects.equals(((MultimediaFragment) current).getSubject(), subject)
557ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          || !Objects.equals(((MultimediaFragment) current).getImageUri(), imageUri)
558ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          || !Objects.equals(((MultimediaFragment) current).getLocation(), location)) {
5592ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian        LogUtil.i("AnswerFragment.updateDataFragment", "Replacing multimedia fragment");
560ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        // Needs replacement
561ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        newFragment =
562ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian            MultimediaFragment.newInstance(
56310b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian                multimediaData,
56410b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian                false /* isInteractive */,
565f94391034e9d591c18d04c0b796d944938201f6aAndroid Dialer                !primaryInfo.isSpam() /* showAvatar */,
566f94391034e9d591c18d04c0b796d944938201f6aAndroid Dialer                primaryInfo.isSpam());
567ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      }
568ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    } else if (shouldShowAvatar()) {
569ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      // Needs Avatar
570ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      if (!(current instanceof AvatarFragment)) {
5712ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian        LogUtil.i("AnswerFragment.updateDataFragment", "Replacing avatar fragment");
572ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        // Needs replacement
573ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        newFragment = new AvatarFragment();
574ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      }
575ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    } else {
576ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      // Needs empty
577ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      if (current != null) {
5782ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian        LogUtil.i("AnswerFragment.updateDataFragment", "Removing current fragment");
579ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        getChildFragmentManager().beginTransaction().remove(current).commitNow();
580ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      }
581ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      contactGridManager.setAvatarImageView(null, 0, false);
582ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
583ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
584ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (newFragment != null) {
585ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      getChildFragmentManager()
586ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          .beginTransaction()
587ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          .replace(R.id.incall_data_container, newFragment)
588ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          .commitNow();
589ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
590ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
591ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
592ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private boolean shouldShowAvatar() {
593d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    return !isVideoCall() && !isVideoUpgradeRequest();
594ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
595ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
596ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private boolean canShowMap() {
597d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    return MapsComponent.get(getContext()).getMaps().isAvailable();
598ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
599ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
600ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
601ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void updateAvatar(AvatarPresenter avatarContainer) {
602ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    contactGridManager.setAvatarImageView(
603ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        avatarContainer.getAvatarImageView(),
604ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        avatarContainer.getAvatarSize(),
605ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        avatarContainer.shouldShowAnonymousAvatar());
606ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
607ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
608ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
609ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void setSecondary(@NonNull SecondaryInfo secondaryInfo) {}
610ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
611ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
612ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void setCallState(@NonNull PrimaryCallState primaryCallState) {
613ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    LogUtil.i("AnswerFragment.setCallState", primaryCallState.toString());
614ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    this.primaryCallState = primaryCallState;
615ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    contactGridManager.setCallState(primaryCallState);
616ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
617ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
618ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
619ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void setEndCallButtonEnabled(boolean enabled, boolean animate) {}
620ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
621ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
622ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void showManageConferenceCallButton(boolean visible) {}
623ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
624ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
625ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public boolean isManageConferenceVisible() {
626ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return false;
627ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
628ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
629ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
630ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
631ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    contactGridManager.dispatchPopulateAccessibilityEvent(event);
632ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    // Add prompt of how to accept/decline call with swipe gesture.
633ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (AccessibilityUtil.isTouchExplorationEnabled(getContext())) {
634ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      event
635ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          .getText()
636ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          .add(getResources().getString(R.string.a11y_incoming_call_swipe_gesture_prompt));
637ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
638ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
639ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
640ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
641ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void showNoteSentToast() {}
642ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
643ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
644ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void updateInCallScreenColors() {}
645ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
646ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
647ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void onInCallScreenDialpadVisibilityChange(boolean isShowing) {}
648ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
649ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
650ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public int getAnswerAndDialpadContainerResourceId() {
6519050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian    throw Assert.createUnsupportedOperationFailException();
652ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
653ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
654ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
655ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public Fragment getInCallScreenFragment() {
656ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return this;
657ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
658ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
659ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
660ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void onDestroy() {
661ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    super.onDestroy();
662ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
663ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
664ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
665ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public View onCreateView(
666ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
667cf61ca00e96f7fb723ca2d4406ec24485a60acd1wangqi    Trace.beginSection("AnswerFragment.onCreateView");
668ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    Bundle arguments = getArguments();
669ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    Assert.checkState(arguments.containsKey(ARG_CALL_ID));
670219b870aa9e9c4046ca1dd915d586010eec1b69fwangqi    Assert.checkState(arguments.containsKey(ARG_IS_RTT_CALL));
671d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    Assert.checkState(arguments.containsKey(ARG_IS_VIDEO_CALL));
672ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    Assert.checkState(arguments.containsKey(ARG_IS_VIDEO_UPGRADE_REQUEST));
673ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
674ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    buttonAcceptClicked = false;
675ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    buttonRejectClicked = false;
676ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
677ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    View view = inflater.inflate(R.layout.fragment_incoming_call, container, false);
678ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    secondaryButton = (SwipeButtonView) view.findViewById(R.id.incoming_secondary_button);
6799050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian    answerAndReleaseButton = (SwipeButtonView) view.findViewById(R.id.incoming_secondary_button2);
680ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
681ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    affordanceHolderLayout = (AffordanceHolderLayout) view.findViewById(R.id.incoming_container);
682ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    affordanceHolderLayout.setAffordanceCallback(affordanceCallback);
683ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
684ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    importanceBadge = view.findViewById(R.id.incall_important_call_badge);
685ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    importanceBadge
686ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        .getViewTreeObserver()
687ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        .addOnGlobalLayoutListener(
688ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian            new OnGlobalLayoutListener() {
689ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian              @Override
690ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian              public void onGlobalLayout() {
691ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian                int leftRightPadding = importanceBadge.getHeight() / 2;
692ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian                importanceBadge.setPadding(
693ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian                    leftRightPadding,
694ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian                    importanceBadge.getPaddingTop(),
695ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian                    leftRightPadding,
696ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian                    importanceBadge.getPaddingBottom());
697ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian              }
698ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian            });
699ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    updateImportanceBadgeVisibility();
700ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
701ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    contactGridManager = new ContactGridManager(view, null, 0, false /* showAnonymousAvatar */);
7021d62ab209130bdacdb64b2cd824b5ff35817b89fwangqi    boolean isInMultiWindowMode = ActivityCompat.isInMultiWindowMode(getActivity());
7031d62ab209130bdacdb64b2cd824b5ff35817b89fwangqi    contactGridManager.onMultiWindowModeChanged(isInMultiWindowMode);
704ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
705ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    Fragment answerMethod =
706ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        getChildFragmentManager().findFragmentById(R.id.answer_method_container);
707ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (AnswerMethodFactory.needsReplacement(answerMethod)) {
708ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      getChildFragmentManager()
709ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          .beginTransaction()
710ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          .replace(
711ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian              R.id.answer_method_container, AnswerMethodFactory.createAnswerMethod(getActivity()))
712ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          .commitNow();
713ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
714ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
715ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    answerScreenDelegate =
716ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        FragmentUtils.getParentUnsafe(this, AnswerScreenDelegateFactory.class)
717ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian            .newAnswerScreenDelegate(this);
718ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
719ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    initSecondaryButton();
720ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
721ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    int flags = View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
7221d62ab209130bdacdb64b2cd824b5ff35817b89fwangqi    if (!isInMultiWindowMode
723ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        && (getActivity().checkSelfPermission(permission.STATUS_BAR)
724ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian            == PackageManager.PERMISSION_GRANTED)) {
725ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      LogUtil.i("AnswerFragment.onCreateView", "STATUS_BAR permission granted, disabling nav bar");
726ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      // These flags will suppress the alert that the activity is in full view mode
727ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      // during an incoming call on a fresh system/factory reset of the app
728ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      flags |= STATUS_BAR_DISABLE_BACK | STATUS_BAR_DISABLE_HOME | STATUS_BAR_DISABLE_RECENT;
729ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
730ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    view.setSystemUiVisibility(flags);
731d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    if (isVideoCall() || isVideoUpgradeRequest()) {
7322ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian      if (VideoUtils.hasCameraPermissionAndShownPrivacyToast(getContext())) {
733fc37b02f5d3381a7882770941e461b13b679b6efEric Erfanian        if (isSelfManagedCamera()) {
734fc37b02f5d3381a7882770941e461b13b679b6efEric Erfanian          answerVideoCallScreen = new SelfManagedAnswerVideoCallScreen(getCallId(), this, view);
735fc37b02f5d3381a7882770941e461b13b679b6efEric Erfanian        } else {
736fc37b02f5d3381a7882770941e461b13b679b6efEric Erfanian          answerVideoCallScreen = new AnswerVideoCallScreen(getCallId(), this, view);
737fc37b02f5d3381a7882770941e461b13b679b6efEric Erfanian        }
738ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      } else {
739ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        view.findViewById(R.id.videocall_video_off).setVisibility(View.VISIBLE);
740ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      }
741ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
742ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
743cf61ca00e96f7fb723ca2d4406ec24485a60acd1wangqi    Trace.endSection();
744ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return view;
745ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
746ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
747ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
748ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void onAttach(Context context) {
749ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    super.onAttach(context);
750ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    FragmentUtils.checkParent(this, InCallScreenDelegateFactory.class);
751ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
752ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
753ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
754ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void onViewCreated(final View view, @Nullable Bundle savedInstanceState) {
7559982f0db5e9b74a66d22befa113073c9cfcd221ewangqi    Trace.beginSection("AnswerFragment.onViewCreated");
756ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    super.onViewCreated(view, savedInstanceState);
757ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    createInCallScreenDelegate();
758ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    updateUI();
759ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
760ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (savedInstanceState == null || !savedInstanceState.getBoolean(STATE_HAS_ANIMATED_ENTRY)) {
761d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      ViewUtil.doOnGlobalLayout(view, this::animateEntry);
762ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
7639982f0db5e9b74a66d22befa113073c9cfcd221ewangqi    Trace.endSection();
764ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
765ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
766ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
767ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void onResume() {
7689982f0db5e9b74a66d22befa113073c9cfcd221ewangqi    Trace.beginSection("AnswerFragment.onResume");
769ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    super.onResume();
770ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    LogUtil.i("AnswerFragment.onResume", null);
7719050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian    restoreSwipeHintTexts();
772ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    inCallScreenDelegate.onInCallScreenResumed();
7739982f0db5e9b74a66d22befa113073c9cfcd221ewangqi    Trace.endSection();
774ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
775ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
776ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
777ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void onStart() {
7789982f0db5e9b74a66d22befa113073c9cfcd221ewangqi    Trace.beginSection("AnswerFragment.onStart");
779ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    super.onStart();
780ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    LogUtil.i("AnswerFragment.onStart", null);
781ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
782ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    updateUI();
783ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (answerVideoCallScreen != null) {
784d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      answerVideoCallScreen.onVideoScreenStart();
785ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
7869982f0db5e9b74a66d22befa113073c9cfcd221ewangqi    Trace.endSection();
787ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
788ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
789ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
790ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void onStop() {
7919982f0db5e9b74a66d22befa113073c9cfcd221ewangqi    Trace.beginSection("AnswerFragment.onStop");
792ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    super.onStop();
793ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    LogUtil.i("AnswerFragment.onStop", null);
794ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
795ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    handler.removeCallbacks(swipeHintRestoreTimer);
796ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (answerVideoCallScreen != null) {
797d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      answerVideoCallScreen.onVideoScreenStop();
798ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
7999982f0db5e9b74a66d22befa113073c9cfcd221ewangqi    Trace.endSection();
800ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
801ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
802ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
803ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void onPause() {
8049982f0db5e9b74a66d22befa113073c9cfcd221ewangqi    Trace.beginSection("AnswerFragment.onPause");
805ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    super.onPause();
806ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    LogUtil.i("AnswerFragment.onPause", null);
80710b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian    inCallScreenDelegate.onInCallScreenPaused();
8089982f0db5e9b74a66d22befa113073c9cfcd221ewangqi    Trace.endSection();
809ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
810ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
811ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
812ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void onDestroyView() {
813ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    LogUtil.i("AnswerFragment.onDestroyView", null);
814ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (answerVideoCallScreen != null) {
815ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      answerVideoCallScreen = null;
816ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
817ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    super.onDestroyView();
818ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    inCallScreenDelegate.onInCallScreenUnready();
819ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    answerScreenDelegate.onAnswerScreenUnready();
820ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
821ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
822ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
823ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void onSaveInstanceState(Bundle bundle) {
824ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    super.onSaveInstanceState(bundle);
825ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    bundle.putBoolean(STATE_HAS_ANIMATED_ENTRY, hasAnimatedEntry);
826ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
827ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
828ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private void updateUI() {
829ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (getView() == null) {
830ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      return;
831ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
832ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
833ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (primaryInfo != null) {
834ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      updatePrimaryUI();
835ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
836ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (primaryCallState != null) {
837ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      contactGridManager.setCallState(primaryCallState);
838ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
839ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
840ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    restoreBackgroundMaskColor();
841ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
842ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
843ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
844219b870aa9e9c4046ca1dd915d586010eec1b69fwangqi  public boolean isRttCall() {
845219b870aa9e9c4046ca1dd915d586010eec1b69fwangqi    return getArguments().getBoolean(ARG_IS_RTT_CALL);
846219b870aa9e9c4046ca1dd915d586010eec1b69fwangqi  }
847219b870aa9e9c4046ca1dd915d586010eec1b69fwangqi
848219b870aa9e9c4046ca1dd915d586010eec1b69fwangqi  @Override
849ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public boolean isVideoCall() {
850d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    return getArguments().getBoolean(ARG_IS_VIDEO_CALL);
851ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
852ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
853fc37b02f5d3381a7882770941e461b13b679b6efEric Erfanian  public boolean isSelfManagedCamera() {
854fc37b02f5d3381a7882770941e461b13b679b6efEric Erfanian    return getArguments().getBoolean(ARG_IS_SELF_MANAGED_CAMERA);
855fc37b02f5d3381a7882770941e461b13b679b6efEric Erfanian  }
856fc37b02f5d3381a7882770941e461b13b679b6efEric Erfanian
857ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
858ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void onAnswerProgressUpdate(@FloatRange(from = -1f, to = 1f) float answerProgress) {
859ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    // Don't fade the window background for call waiting or video upgrades. Fading the background
860ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    // shows the system wallpaper which looks bad because on reject we switch to another call.
86131fe99856b34854bd36a17d02b774095dcfe51a6Android Dialer    if (primaryCallState.state() == State.INCOMING && !isVideoCall()) {
862ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      answerScreenDelegate.updateWindowBackgroundColor(answerProgress);
863ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
864ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
865ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    // Fade and scale contact name and video call text
866ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    float startDelay = .25f;
867ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    // Header progress is zero over positiveAdjustedProgress = [0, startDelay],
868ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    // linearly increases over (startDelay, 1] until reaching 1 when positiveAdjustedProgress = 1
869ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    float headerProgress = Math.max(0, (Math.abs(answerProgress) - 1) / (1 - startDelay) + 1);
870ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    fadeToward(contactGridManager.getContainerView(), 1 - headerProgress);
871ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    scaleToward(contactGridManager.getContainerView(), MathUtil.lerp(1f, .75f, headerProgress));
872ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
873ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (Math.abs(answerProgress) >= .0001) {
874ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      affordanceHolderLayout.animateHideLeftRightIcon();
875ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      handler.removeCallbacks(swipeHintRestoreTimer);
876ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      restoreSwipeHintTexts();
877ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
878ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
879ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
880ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
881ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void answerFromMethod() {
882ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    acceptCallByUser(false /* answerVideoAsAudio */);
883ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
884ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
885ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
886ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void rejectFromMethod() {
887ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    rejectCall();
888ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
889ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
890ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
891ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void resetAnswerProgress() {
892ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    affordanceHolderLayout.reset(true);
893ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    restoreBackgroundMaskColor();
894ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
895ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
896ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private void animateEntry(@NonNull View rootView) {
897d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian    if (!isAdded()) {
898d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian      LogUtil.i(
899d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian          "AnswerFragment.animateEntry",
900d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian          "Not currently added to Activity. Will not start entry animation.");
901d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian      return;
902d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian    }
903ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    contactGridManager.getContainerView().setAlpha(0f);
904ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    Animator alpha =
905ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        ObjectAnimator.ofFloat(contactGridManager.getContainerView(), View.ALPHA, 0, 1);
906ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    Animator topRow = createTranslation(rootView.findViewById(R.id.contactgrid_top_row));
907ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    Animator contactName = createTranslation(rootView.findViewById(R.id.contactgrid_contact_name));
908ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    Animator bottomRow = createTranslation(rootView.findViewById(R.id.contactgrid_bottom_row));
909ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    Animator important = createTranslation(importanceBadge);
910ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    Animator dataContainer = createTranslation(rootView.findViewById(R.id.incall_data_container));
911ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
912ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    AnimatorSet animatorSet = new AnimatorSet();
913d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    AnimatorSet.Builder builder = animatorSet.play(alpha);
914d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    builder.with(topRow).with(contactName).with(bottomRow).with(important).with(dataContainer);
915d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    if (isShowingLocationUi()) {
916d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      builder.with(createTranslation(rootView.findViewById(R.id.incall_location_holder)));
917d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    }
918d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian    animatorSet.setDuration(
919d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian        rootView.getResources().getInteger(R.integer.answer_animate_entry_millis));
920ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    animatorSet.addListener(
921ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        new AnimatorListenerAdapter() {
922ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          @Override
923ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          public void onAnimationEnd(Animator animation) {
924ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian            hasAnimatedEntry = true;
925ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          }
926ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        });
927ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    animatorSet.start();
928ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
929ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
930ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private ObjectAnimator createTranslation(View view) {
931ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    float translationY = view.getTop() * 0.5f;
932ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    ObjectAnimator animator = ObjectAnimator.ofFloat(view, View.TRANSLATION_Y, translationY, 0);
933ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    animator.setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN);
934ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return animator;
935ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
936ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
937ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private void acceptCallByUser(boolean answerVideoAsAudio) {
938ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    LogUtil.i("AnswerFragment.acceptCallByUser", answerVideoAsAudio ? " answerVideoAsAudio" : "");
939ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (!buttonAcceptClicked) {
940d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      answerScreenDelegate.onAnswer(answerVideoAsAudio);
941ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      buttonAcceptClicked = true;
942ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
943ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
944ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
945ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private void rejectCall() {
946ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    LogUtil.i("AnswerFragment.rejectCall", null);
947ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (!buttonRejectClicked) {
948ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      Context context = getContext();
949ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      if (context == null) {
950ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        LogUtil.w(
951ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian            "AnswerFragment.rejectCall",
952ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian            "Null context when rejecting call. Logger call was skipped");
953ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      } else {
954ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        Logger.get(context)
955ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian            .logImpression(DialerImpression.Type.REJECT_INCOMING_CALL_FROM_ANSWER_SCREEN);
956ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      }
957ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      buttonRejectClicked = true;
958ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      answerScreenDelegate.onReject();
959ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
960ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
961ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
962ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private void restoreBackgroundMaskColor() {
963ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    answerScreenDelegate.updateWindowBackgroundColor(0);
964ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
965ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
966ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private void restoreSwipeHintTexts() {
967ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (getAnswerMethod() != null) {
9689050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian      if (allowAnswerAndRelease()) {
9699050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian        if (hasCallOnHold()) {
9709050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian          getAnswerMethod()
9719050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian              .setHintText(getText(R.string.call_incoming_default_label_answer_and_release_third));
97231fe99856b34854bd36a17d02b774095dcfe51a6Android Dialer        } else if (primaryCallState.supportsCallOnHold()) {
9739050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian          getAnswerMethod()
9749050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian              .setHintText(getText(R.string.call_incoming_default_label_answer_and_release_second));
9759050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian        }
9769050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian      } else {
9779050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian        getAnswerMethod().setHintText(null);
9789050823ccf6f512e06ad65c8a741cb17cbc4a833Eric Erfanian      }
979ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
980ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
981ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
982ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private void showMessageMenu() {
983ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    LogUtil.i("AnswerFragment.showMessageMenu", "Show sms menu.");
9842ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian    if (getContext() == null || isDetached() || getChildFragmentManager().isDestroyed()) {
98510b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian      return;
98610b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian    }
987ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
988ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    textResponsesFragment = SmsBottomSheetFragment.newInstance(textResponses);
989ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    textResponsesFragment.show(getChildFragmentManager(), null);
990ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    secondaryButton
991ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        .animate()
992ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        .alpha(0)
993ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        .withEndAction(
994ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian            new Runnable() {
995ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian              @Override
996ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian              public void run() {
997ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian                affordanceHolderLayout.reset(false);
998ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian                secondaryButton.animate().alpha(1);
999ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian              }
1000ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian            });
100165e19075682f3c0cdaca367138560d80ac4a3106roldenburg
100265e19075682f3c0cdaca367138560d80ac4a3106roldenburg    TelecomUtil.silenceRinger(getContext());
1003ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
1004ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
1005ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
10068efb49584f732014076390093ad90e23dce2e3batwyen  public InCallUiLock acquireInCallUiLock(String tag) {
10078efb49584f732014076390093ad90e23dce2e3batwyen    return answerScreenDelegate.acquireInCallUiLock(tag);
10088efb49584f732014076390093ad90e23dce2e3batwyen  }
10098efb49584f732014076390093ad90e23dce2e3batwyen
10108efb49584f732014076390093ad90e23dce2e3batwyen  @Override
1011ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void smsSelected(@Nullable CharSequence text) {
1012ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    LogUtil.i("AnswerFragment.smsSelected", null);
1013ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    textResponsesFragment = null;
1014ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
1015ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (text == null) {
1016ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      createCustomSmsDialogFragment = CreateCustomSmsDialogFragment.newInstance();
1017ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      createCustomSmsDialogFragment.show(getChildFragmentManager(), null);
1018ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      return;
1019ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
1020ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
1021ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (primaryCallState != null && canRejectCallWithSms()) {
1022ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      rejectCall();
1023ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      answerScreenDelegate.onRejectCallWithMessage(text.toString());
1024ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
1025ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
1026ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
1027ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
1028ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void smsDismissed() {
1029ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    LogUtil.i("AnswerFragment.smsDismissed", null);
1030ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    textResponsesFragment = null;
1031ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
1032ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
1033ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
1034ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void customSmsCreated(@NonNull CharSequence text) {
1035ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    LogUtil.i("AnswerFragment.customSmsCreated", null);
1036ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    createCustomSmsDialogFragment = null;
1037ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (primaryCallState != null && canRejectCallWithSms()) {
1038ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      rejectCall();
1039ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      answerScreenDelegate.onRejectCallWithMessage(text.toString());
1040ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
1041ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
1042ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
1043ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
1044ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void customSmsDismissed() {
1045ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    LogUtil.i("AnswerFragment.customSmsDismissed", null);
1046ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    createCustomSmsDialogFragment = null;
1047ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
1048ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
1049ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private boolean canRejectCallWithSms() {
1050ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return primaryCallState != null
105131fe99856b34854bd36a17d02b774095dcfe51a6Android Dialer        && !(primaryCallState.state() == State.DISCONNECTED
105231fe99856b34854bd36a17d02b774095dcfe51a6Android Dialer            || primaryCallState.state() == State.DISCONNECTING
105331fe99856b34854bd36a17d02b774095dcfe51a6Android Dialer            || primaryCallState.state() == State.IDLE);
1054ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
1055ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
1056ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private void createInCallScreenDelegate() {
1057ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    inCallScreenDelegate =
1058ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        FragmentUtils.getParentUnsafe(this, InCallScreenDelegateFactory.class)
1059ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian            .newInCallScreenDelegate();
1060ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    Assert.isNotNull(inCallScreenDelegate);
1061ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    inCallScreenDelegate.onInCallScreenDelegateInit(this);
1062ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    inCallScreenDelegate.onInCallScreenReady();
1063ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
1064ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
1065ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private void updateImportanceBadgeVisibility() {
10662ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian    if (!isAdded() || getView() == null) {
1067ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      return;
1068ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
1069ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
1070f94391034e9d591c18d04c0b796d944938201f6aAndroid Dialer    if (!getResources().getBoolean(R.bool.answer_important_call_allowed) || primaryInfo.isSpam()) {
1071ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      importanceBadge.setVisibility(View.GONE);
1072ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      return;
1073ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
1074ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
1075ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    MultimediaData multimediaData = getSessionData();
1076ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    boolean showImportant = multimediaData != null && multimediaData.isImportant();
1077ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    TransitionManager.beginDelayedTransition((ViewGroup) importanceBadge.getParent());
1078ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    // TODO (keyboardr): Change this back to being View.INVISIBLE once mocks are available to
1079ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    // properly handle smaller screens
1080ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    importanceBadge.setVisibility(showImportant ? View.VISIBLE : View.GONE);
1081ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
1082ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
1083ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Nullable
1084ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private MultimediaData getSessionData() {
1085ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (primaryInfo == null) {
1086ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      return null;
1087ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
10889779f967ebb9512e5b19090b071572c9c4f0f2a6Eric Erfanian    if (isVideoUpgradeRequest()) {
10899779f967ebb9512e5b19090b071572c9c4f0f2a6Eric Erfanian      return null;
10909779f967ebb9512e5b19090b071572c9c4f0f2a6Eric Erfanian    }
1091f94391034e9d591c18d04c0b796d944938201f6aAndroid Dialer    return primaryInfo.multimediaData();
1092ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
1093ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
1094ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  /** Shows the Avatar image if available. */
1095ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public static class AvatarFragment extends Fragment implements AvatarPresenter {
1096ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
1097ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    private ImageView avatarImageView;
1098ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
1099ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    @Nullable
1100ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    @Override
1101ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    public View onCreateView(
1102ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        LayoutInflater layoutInflater, @Nullable ViewGroup viewGroup, @Nullable Bundle bundle) {
1103ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      return layoutInflater.inflate(R.layout.fragment_avatar, viewGroup, false);
1104ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
1105ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
1106ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    @Override
1107ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    public void onViewCreated(View view, @Nullable Bundle bundle) {
1108ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      super.onViewCreated(view, bundle);
1109ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      avatarImageView = ((ImageView) view.findViewById(R.id.contactgrid_avatar));
1110ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      FragmentUtils.getParentUnsafe(this, MultimediaFragment.Holder.class).updateAvatar(this);
1111ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
1112ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
1113ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    @NonNull
1114ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    @Override
1115ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    public ImageView getAvatarImageView() {
1116ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      return avatarImageView;
1117ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
1118ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
1119ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    @Override
1120ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    public int getAvatarSize() {
1121ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      return getResources().getDimensionPixelSize(R.dimen.answer_avatar_size);
1122ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
1123ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
1124ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    @Override
1125ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    public boolean shouldShowAnonymousAvatar() {
1126ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      return false;
1127ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
1128ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
1129ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian}
1130