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