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