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.answermethod; 18ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 19ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.animation.Animator; 20ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.animation.AnimatorListenerAdapter; 21ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.animation.AnimatorSet; 22ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.animation.ObjectAnimator; 23ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.animation.PropertyValuesHolder; 24ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.animation.ValueAnimator; 25ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.animation.ValueAnimator.AnimatorUpdateListener; 26ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.os.Bundle; 27ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.support.annotation.FloatRange; 28ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.support.annotation.NonNull; 29ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.support.annotation.Nullable; 30ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.text.TextUtils; 31ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.view.LayoutInflater; 32ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.view.MotionEvent; 33ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.view.View; 34ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.view.View.OnClickListener; 35ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.view.ViewGroup; 36ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.widget.TextView; 37ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.dialer.common.Assert; 38ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.dialer.common.LogUtil; 39ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.dialer.compat.ActivityCompat; 40ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.incallui.answer.impl.answermethod.FlingUpDownTouchHandler.OnProgressChangedListener; 41ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.incallui.util.AccessibilityUtil; 42ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 43ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/** Answer method that shows two buttons for answer/reject. */ 44ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpublic class TwoButtonMethod extends AnswerMethod 45ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian implements OnClickListener, AnimatorUpdateListener { 46ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 47ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private static final String STATE_HINT_TEXT = "hintText"; 48ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private static final String STATE_INCOMING_WILL_DISCONNECT = "incomingWillDisconnect"; 49ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 50ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private View answerButton; 51ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private View answerLabel; 52ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private View declineButton; 53ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private View declineLabel; 54ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private TextView hintTextView; 55ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private boolean incomingWillDisconnect; 56ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private boolean buttonClicked; 57ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private CharSequence hintText; 58ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Nullable private FlingUpDownTouchHandler touchHandler; 59ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 60ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 61ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void onCreate(@Nullable Bundle bundle) { 62ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian super.onCreate(bundle); 63ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (bundle != null) { 64ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian incomingWillDisconnect = bundle.getBoolean(STATE_INCOMING_WILL_DISCONNECT); 65ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian hintText = bundle.getCharSequence(STATE_HINT_TEXT); 66ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 67ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 68ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 69ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 70ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void onSaveInstanceState(Bundle bundle) { 71ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian super.onSaveInstanceState(bundle); 72ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian bundle.putBoolean(STATE_INCOMING_WILL_DISCONNECT, incomingWillDisconnect); 73ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian bundle.putCharSequence(STATE_HINT_TEXT, hintText); 74ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 75ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 76ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Nullable 77ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 78ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public View onCreateView( 79ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian LayoutInflater layoutInflater, @Nullable ViewGroup viewGroup, @Nullable Bundle bundle) { 80ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian View view = layoutInflater.inflate(R.layout.two_button_method, viewGroup, false); 81ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 82ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian hintTextView = (TextView) view.findViewById(R.id.two_button_hint_text); 83ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian updateHintText(); 84ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 85ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian answerButton = view.findViewById(R.id.two_button_answer_button); 86ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian answerLabel = view.findViewById(R.id.two_button_answer_label); 87ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian declineButton = view.findViewById(R.id.two_button_decline_button); 88ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian declineLabel = view.findViewById(R.id.two_button_decline_label); 89ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 90ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian boolean showLabels = getResources().getBoolean(R.bool.two_button_show_button_labels); 91ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian answerLabel.setVisibility(showLabels ? View.VISIBLE : View.GONE); 92ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian declineLabel.setVisibility(showLabels ? View.VISIBLE : View.GONE); 93ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 94ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian answerButton.setOnClickListener(this); 95ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian declineButton.setOnClickListener(this); 96ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 97ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (AccessibilityUtil.isTouchExplorationEnabled(getContext())) { 98ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /* Falsing already handled by AccessibilityManager */ 99ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian touchHandler = 100ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian FlingUpDownTouchHandler.attach( 101ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian view, 102ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian new OnProgressChangedListener() { 103ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 104ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void onProgressChanged(@FloatRange(from = -1f, to = 1f) float progress) {} 105ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 106ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 107ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void onTrackingStart() {} 108ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 109ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 110ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void onTrackingStopped() {} 111ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 112ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 113ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void onMoveReset(boolean showHint) {} 114ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 115ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 116ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void onMoveFinish(boolean accept) { 117ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (accept) { 118ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian answerCall(); 119ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } else { 120ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian rejectCall(); 121ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 122ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 123ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 124ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 125ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public boolean shouldUseFalsing(@NonNull MotionEvent downEvent) { 126ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return false; 127ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 128ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian }, 129ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian null /* Falsing already handled by AccessibilityManager */); 130ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian touchHandler.setFlingEnabled(false); 131ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 132ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return view; 133ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 134ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 135ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 136ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void onDestroyView() { 137ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian super.onDestroyView(); 138ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (touchHandler != null) { 139ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian touchHandler.detach(); 140ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian touchHandler = null; 141ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 142ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 143ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 144ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 145ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void setHintText(@Nullable CharSequence hintText) { 146ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian this.hintText = hintText; 147ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian updateHintText(); 148ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 149ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 150ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 151ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void setShowIncomingWillDisconnect(boolean incomingWillDisconnect) { 152ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian this.incomingWillDisconnect = incomingWillDisconnect; 153ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian updateHintText(); 154ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 155ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 156ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private void updateHintText() { 157ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (hintTextView == null) { 158ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return; 159ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 160ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian hintTextView.setVisibility( 161ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian ActivityCompat.isInMultiWindowMode(getActivity()) ? View.GONE : View.VISIBLE); 162ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (!TextUtils.isEmpty(hintText) && !buttonClicked) { 163ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian hintTextView.setText(hintText); 164ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian hintTextView.animate().alpha(1f).start(); 165ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } else if (incomingWillDisconnect && !buttonClicked) { 166ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian hintTextView.setText(R.string.call_incoming_will_disconnect); 167ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian hintTextView.animate().alpha(1f).start(); 168ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } else { 169ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian hintTextView.animate().alpha(0f).start(); 170ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 171ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 172ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 173ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 174ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void onClick(View view) { 175ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (view == answerButton) { 176ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian answerCall(); 177ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian LogUtil.v("TwoButtonMethod.onClick", "Call answered"); 178ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } else if (view == declineButton) { 179ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian rejectCall(); 180ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian LogUtil.v("TwoButtonMethod.onClick", "two_buttonMethod Call rejected"); 181ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } else { 182ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian Assert.fail("Unknown click from view: " + view); 183ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 184ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian buttonClicked = true; 185ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 186ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 187ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private void answerCall() { 188ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian ValueAnimator animator = ValueAnimator.ofFloat(0, 1); 189ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian animator.addUpdateListener(this); 190ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian animator.addListener( 191ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian new AnimatorListenerAdapter() { 192ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private boolean canceled; 193ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 194ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 195ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void onAnimationCancel(Animator animation) { 196ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian canceled = true; 197ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 198ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 199ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 200ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void onAnimationEnd(Animator animation) { 201ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (!canceled) { 202ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian getParent().answerFromMethod(); 203ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 204ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 205ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian }); 206ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian AnimatorSet animatorSet = new AnimatorSet(); 207ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian animatorSet.play(animator).with(createViewHideAnimation()); 208ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian animatorSet.start(); 209ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 210ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 211ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private void rejectCall() { 212ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian ValueAnimator animator = ValueAnimator.ofFloat(0, -1); 213ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian animator.addUpdateListener(this); 214ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian animator.addListener( 215ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian new AnimatorListenerAdapter() { 216ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private boolean canceled; 217ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 218ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 219ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void onAnimationCancel(Animator animation) { 220ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian canceled = true; 221ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 222ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 223ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 224ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void onAnimationEnd(Animator animation) { 225ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (!canceled) { 226ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian getParent().rejectFromMethod(); 227ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 228ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 229ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian }); 230ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian AnimatorSet animatorSet = new AnimatorSet(); 231ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian animatorSet.play(animator).with(createViewHideAnimation()); 232ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian animatorSet.start(); 233ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 234ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 235ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 236ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void onAnimationUpdate(ValueAnimator animation) { 237ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian getParent().onAnswerProgressUpdate(((float) animation.getAnimatedValue())); 238ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 239ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 240ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private Animator createViewHideAnimation() { 241ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian ObjectAnimator answerButtonHide = 242ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian ObjectAnimator.ofPropertyValuesHolder( 243ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian answerButton, 244ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian PropertyValuesHolder.ofFloat(View.SCALE_X, 0f), 245ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian PropertyValuesHolder.ofFloat(View.SCALE_Y, 0f)); 246ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 247ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian ObjectAnimator declineButtonHide = 248ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian ObjectAnimator.ofPropertyValuesHolder( 249ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian declineButton, 250ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian PropertyValuesHolder.ofFloat(View.SCALE_X, 0f), 251ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian PropertyValuesHolder.ofFloat(View.SCALE_Y, 0f)); 252ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 253ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian ObjectAnimator answerLabelHide = ObjectAnimator.ofFloat(answerLabel, View.ALPHA, 0f); 254ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 255ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian ObjectAnimator declineLabelHide = ObjectAnimator.ofFloat(declineLabel, View.ALPHA, 0f); 256ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 257ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian ObjectAnimator hintHide = ObjectAnimator.ofFloat(hintTextView, View.ALPHA, 0f); 258ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 259ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian AnimatorSet hideSet = new AnimatorSet(); 260ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian hideSet 261ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian .play(answerButtonHide) 262ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian .with(declineButtonHide) 263ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian .with(answerLabelHide) 264ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian .with(declineLabelHide) 265ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian .with(hintHide); 266ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return hideSet; 267ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 268ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian} 269