113b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati/* 213b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati * Copyright (C) 2014 The Android Open Source Project 313b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati * 413b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati * Licensed under the Apache License, Version 2.0 (the "License"); 513b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati * you may not use this file except in compliance with the License. 613b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati * You may obtain a copy of the License at 713b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati * 813b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati * http://www.apache.org/licenses/LICENSE-2.0 913b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati * 1013b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati * Unless required by applicable law or agreed to in writing, software 1113b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati * distributed under the License is distributed on an "AS IS" BASIS, 1213b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1313b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati * See the License for the specific language governing permissions and 1413b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati * limitations under the License. 1513b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati */ 1613b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 1713b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapatipackage com.android.phone.common.dialpad; 1813b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 1913b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapatiimport android.animation.AnimatorListenerAdapter; 2013b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapatiimport android.content.Context; 2113b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapatiimport android.content.res.ColorStateList; 22e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunnimport android.content.res.Configuration; 2313b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapatiimport android.content.res.Resources; 2413b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapatiimport android.content.res.TypedArray; 2513b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapatiimport android.graphics.drawable.RippleDrawable; 26e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunnimport android.text.TextUtils; 2713b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapatiimport android.util.AttributeSet; 2813b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapatiimport android.util.Log; 2913b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapatiimport android.view.MotionEvent; 3013b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapatiimport android.view.View; 31972e8730b305c921e094690ae09abf2c44b0dc12Evan Charltonimport android.view.ViewGroup; 32e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunnimport android.view.ViewPropertyAnimator; 33690b2c6971c6c8a8ef447a15b24d8dd1506f2d0bIhab Awadimport android.view.accessibility.AccessibilityManager; 3413b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapatiimport android.widget.EditText; 3513b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapatiimport android.widget.ImageButton; 3613b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapatiimport android.widget.LinearLayout; 3713b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapatiimport android.widget.TextView; 3813b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 3913b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapatiimport com.android.phone.common.R; 4013b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapatiimport com.android.phone.common.animation.AnimUtils; 4113b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 42e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunnimport java.util.Locale; 43e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn 4413b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati/** 4513b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati * View that displays a twelve-key phone dialpad. 4613b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati */ 4713b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapatipublic class DialpadView extends LinearLayout { 4813b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati private static final String TAG = DialpadView.class.getSimpleName(); 4913b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 5013b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati private static final double DELAY_MULTIPLIER = 0.66; 5113b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati private static final double DURATION_MULTIPLIER = 0.8; 5213b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 53e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn /** 54e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn * {@code True} if the dialpad is in landscape orientation. 55e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn */ 56e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn private final boolean mIsLandscape; 57e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn 58e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn /** 59e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn * {@code True} if the dialpad is showing in a right-to-left locale. 60e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn */ 61e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn private final boolean mIsRtl; 62e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn 6313b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati private EditText mDigits; 6413b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati private ImageButton mDelete; 6513b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati private View mOverflowMenuButton; 6613b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati private ColorStateList mRippleColor; 6713b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 68972e8730b305c921e094690ae09abf2c44b0dc12Evan Charlton private ViewGroup mRateContainer; 69972e8730b305c921e094690ae09abf2c44b0dc12Evan Charlton private TextView mIldCountry; 70972e8730b305c921e094690ae09abf2c44b0dc12Evan Charlton private TextView mIldRate; 71972e8730b305c921e094690ae09abf2c44b0dc12Evan Charlton 7213b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati private boolean mCanDigitsBeEdited; 7313b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 7413b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati private final int[] mButtonIds = new int[] {R.id.zero, R.id.one, R.id.two, R.id.three, 7513b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati R.id.four, R.id.five, R.id.six, R.id.seven, R.id.eight, R.id.nine, R.id.star, 7613b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati R.id.pound}; 7713b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 7813b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati // For animation. 7913b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati private static final int KEY_FRAME_DURATION = 33; 8013b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 8113b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati private int mTranslateDistance; 8213b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 8313b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati public DialpadView(Context context) { 8413b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati this(context, null); 8513b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati } 8613b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 8713b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati public DialpadView(Context context, AttributeSet attrs) { 8813b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati this(context, attrs, 0); 8913b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati } 9013b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 9113b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati public DialpadView(Context context, AttributeSet attrs, int defStyle) { 9213b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati super(context, attrs, defStyle); 9313b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 9413b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.Dialpad); 9513b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati mRippleColor = a.getColorStateList(R.styleable.Dialpad_dialpad_key_button_touch_tint); 9613b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati a.recycle(); 9713b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 9813b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati mTranslateDistance = getResources().getDimensionPixelSize( 9913b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati R.dimen.dialpad_key_button_translate_y); 100e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn 101e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn mIsLandscape = getResources().getConfiguration().orientation == 102e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn Configuration.ORIENTATION_LANDSCAPE; 103e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn mIsRtl = TextUtils.getLayoutDirectionFromLocale(Locale.getDefault()) == 104e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn View.LAYOUT_DIRECTION_RTL; 10513b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati } 10613b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 10713b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati @Override 10813b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati protected void onFinishInflate() { 10913b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati setupKeypad(); 11013b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati mDigits = (EditText) findViewById(R.id.digits); 11113b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati mDelete = (ImageButton) findViewById(R.id.deleteButton); 11213b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati mOverflowMenuButton = findViewById(R.id.dialpad_overflow); 113972e8730b305c921e094690ae09abf2c44b0dc12Evan Charlton mRateContainer = (ViewGroup) findViewById(R.id.rate_container); 114972e8730b305c921e094690ae09abf2c44b0dc12Evan Charlton mIldCountry = (TextView) mRateContainer.findViewById(R.id.ild_country); 115972e8730b305c921e094690ae09abf2c44b0dc12Evan Charlton mIldRate = (TextView) mRateContainer.findViewById(R.id.ild_rate); 116690b2c6971c6c8a8ef447a15b24d8dd1506f2d0bIhab Awad 117690b2c6971c6c8a8ef447a15b24d8dd1506f2d0bIhab Awad AccessibilityManager accessibilityManager = (AccessibilityManager) 118690b2c6971c6c8a8ef447a15b24d8dd1506f2d0bIhab Awad getContext().getSystemService(Context.ACCESSIBILITY_SERVICE); 119690b2c6971c6c8a8ef447a15b24d8dd1506f2d0bIhab Awad if (accessibilityManager.isEnabled()) { 120690b2c6971c6c8a8ef447a15b24d8dd1506f2d0bIhab Awad // The text view must be selected to send accessibility events. 121690b2c6971c6c8a8ef447a15b24d8dd1506f2d0bIhab Awad mDigits.setSelected(true); 122690b2c6971c6c8a8ef447a15b24d8dd1506f2d0bIhab Awad } 12313b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati } 12413b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 12513b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati private void setupKeypad() { 12613b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati final int[] numberIds = new int[] {R.string.dialpad_0_number, R.string.dialpad_1_number, 12713b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati R.string.dialpad_2_number, R.string.dialpad_3_number, R.string.dialpad_4_number, 12813b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati R.string.dialpad_5_number, R.string.dialpad_6_number, R.string.dialpad_7_number, 12913b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati R.string.dialpad_8_number, R.string.dialpad_9_number, R.string.dialpad_star_number, 13013b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati R.string.dialpad_pound_number}; 13113b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 13213b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati final int[] letterIds = new int[] {R.string.dialpad_0_letters, R.string.dialpad_1_letters, 13313b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati R.string.dialpad_2_letters, R.string.dialpad_3_letters, R.string.dialpad_4_letters, 13413b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati R.string.dialpad_5_letters, R.string.dialpad_6_letters, R.string.dialpad_7_letters, 13513b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati R.string.dialpad_8_letters, R.string.dialpad_9_letters, 13613b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati R.string.dialpad_star_letters, R.string.dialpad_pound_letters}; 13713b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 13813b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati final Resources resources = getContext().getResources(); 13913b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 14013b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati DialpadKeyButton dialpadKey; 14113b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati TextView numberView; 14213b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati TextView lettersView; 14313b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 14413b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati for (int i = 0; i < mButtonIds.length; i++) { 14513b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati dialpadKey = (DialpadKeyButton) findViewById(mButtonIds[i]); 14613b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati numberView = (TextView) dialpadKey.findViewById(R.id.dialpad_key_number); 14713b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati lettersView = (TextView) dialpadKey.findViewById(R.id.dialpad_key_letters); 14813b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati final String numberString = resources.getString(numberIds[i]); 14913b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati final RippleDrawable rippleBackground = 150fe91e00f6b5720db70e276d8d99482a3abc662e2Yorke Lee (RippleDrawable) getContext().getDrawable(R.drawable.btn_dialpad_key); 15113b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati if (mRippleColor != null) { 15213b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati rippleBackground.setColor(mRippleColor); 15313b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati } 15413b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 15513b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati numberView.setText(numberString); 15613b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati numberView.setElegantTextHeight(false); 15713b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati dialpadKey.setContentDescription(numberString); 15813b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati dialpadKey.setBackground(rippleBackground); 15913b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 16013b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati if (lettersView != null) { 16113b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati lettersView.setText(resources.getString(letterIds[i])); 16213b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati } 16313b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati } 16413b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 16513b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati final DialpadKeyButton one = (DialpadKeyButton) findViewById(R.id.one); 16613b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati one.setLongHoverContentDescription( 16713b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati resources.getText(R.string.description_voicemail_button)); 16813b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 16913b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati final DialpadKeyButton zero = (DialpadKeyButton) findViewById(R.id.zero); 17013b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati zero.setLongHoverContentDescription( 17113b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati resources.getText(R.string.description_image_button_plus)); 17213b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 17313b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati } 17413b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 17513b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati public void setShowVoicemailButton(boolean show) { 17613b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati View view = findViewById(R.id.dialpad_key_voicemail); 17713b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati if (view != null) { 17813b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati view.setVisibility(show ? View.VISIBLE : View.INVISIBLE); 17913b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati } 18013b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati } 18113b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 18213b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati /** 18313b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati * Whether or not the digits above the dialer can be edited. 18413b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati * 18513b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati * @param canBeEdited If true, the backspace button will be shown and the digits EditText 18613b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati * will be configured to allow text manipulation. 18713b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati */ 18813b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati public void setCanDigitsBeEdited(boolean canBeEdited) { 18913b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati View deleteButton = findViewById(R.id.deleteButton); 19013b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati deleteButton.setVisibility(canBeEdited ? View.VISIBLE : View.GONE); 19113b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati View overflowMenuButton = findViewById(R.id.dialpad_overflow); 19213b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati overflowMenuButton.setVisibility(canBeEdited ? View.VISIBLE : View.GONE); 19313b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 19413b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati EditText digits = (EditText) findViewById(R.id.digits); 19513b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati digits.setClickable(canBeEdited); 19613b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati digits.setLongClickable(canBeEdited); 19713b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati digits.setFocusableInTouchMode(canBeEdited); 19813b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati digits.setCursorVisible(false); 19913b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 20013b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati mCanDigitsBeEdited = canBeEdited; 20113b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati } 20213b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 203972e8730b305c921e094690ae09abf2c44b0dc12Evan Charlton public void setCallRateInformation(String countryName, String displayRate) { 204972e8730b305c921e094690ae09abf2c44b0dc12Evan Charlton if (TextUtils.isEmpty(countryName) && TextUtils.isEmpty(displayRate)) { 205972e8730b305c921e094690ae09abf2c44b0dc12Evan Charlton mRateContainer.setVisibility(View.GONE); 206972e8730b305c921e094690ae09abf2c44b0dc12Evan Charlton return; 207972e8730b305c921e094690ae09abf2c44b0dc12Evan Charlton } 208972e8730b305c921e094690ae09abf2c44b0dc12Evan Charlton mRateContainer.setVisibility(View.VISIBLE); 209972e8730b305c921e094690ae09abf2c44b0dc12Evan Charlton mIldCountry.setText(countryName); 210972e8730b305c921e094690ae09abf2c44b0dc12Evan Charlton mIldRate.setText(displayRate); 211972e8730b305c921e094690ae09abf2c44b0dc12Evan Charlton } 212972e8730b305c921e094690ae09abf2c44b0dc12Evan Charlton 21313b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati public boolean canDigitsBeEdited() { 21413b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati return mCanDigitsBeEdited; 21513b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati } 21613b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 21713b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati /** 21813b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati * Always returns true for onHoverEvent callbacks, to fix problems with accessibility due to 21913b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati * the dialpad overlaying other fragments. 22013b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati */ 22113b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati @Override 22213b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati public boolean onHoverEvent(MotionEvent event) { 22313b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati return true; 22413b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati } 22513b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 22613b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati public void animateShow() { 22713b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati // This is a hack; without this, the setTranslationY is delayed in being applied, and the 22813b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati // numbers appear at their original position (0) momentarily before animating. 22913b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati final AnimatorListenerAdapter showListener = new AnimatorListenerAdapter() {}; 23013b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 23113b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati for (int i = 0; i < mButtonIds.length; i++) { 23213b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati int delay = (int)(getKeyButtonAnimationDelay(mButtonIds[i]) * DELAY_MULTIPLIER); 23313b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati int duration = 23413b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati (int)(getKeyButtonAnimationDuration(mButtonIds[i]) * DURATION_MULTIPLIER); 23513b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati final DialpadKeyButton dialpadKey = (DialpadKeyButton) findViewById(mButtonIds[i]); 23613b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 237e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn ViewPropertyAnimator animator = dialpadKey.animate(); 238e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn if (mIsLandscape) { 239e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn // Landscape orientation requires translation along the X axis. 240e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn // For RTL locales, ensure we translate negative on the X axis. 241e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn dialpadKey.setTranslationX((mIsRtl ? -1 : 1) * mTranslateDistance); 242e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn animator.translationX(0); 243e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn } else { 244e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn // Portrait orientation requires translation along the Y axis. 245e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn dialpadKey.setTranslationY(mTranslateDistance); 246e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn animator.translationY(0); 247e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn } 248e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn animator.setInterpolator(AnimUtils.EASE_OUT_EASE_IN) 24913b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati .setStartDelay(delay) 25013b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati .setDuration(duration) 25113b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati .setListener(showListener) 25213b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati .start(); 25313b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati } 25413b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati } 25513b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 25613b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati public EditText getDigits() { 25713b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati return mDigits; 25813b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati } 25913b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 26013b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati public ImageButton getDeleteButton() { 26113b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati return mDelete; 26213b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati } 26313b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 26413b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati public View getOverflowMenuButton() { 26513b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati return mOverflowMenuButton; 26613b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati } 26713b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 268e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn /** 269e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn * Get the animation delay for the buttons, taking into account whether the dialpad is in 270e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn * landscape left-to-right, landscape right-to-left, or portrait. 271e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn * 272e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn * @param buttonId The button ID. 273e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn * @return The animation delay. 274e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn */ 27513b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati private int getKeyButtonAnimationDelay(int buttonId) { 276e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn if (mIsLandscape) { 277e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn if (mIsRtl) { 278e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn switch (buttonId) { 279e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.three: return KEY_FRAME_DURATION * 1; 280e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.six: return KEY_FRAME_DURATION * 2; 281e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.nine: return KEY_FRAME_DURATION * 3; 282e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.pound: return KEY_FRAME_DURATION * 4; 283e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.two: return KEY_FRAME_DURATION * 5; 284e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.five: return KEY_FRAME_DURATION * 6; 285e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.eight: return KEY_FRAME_DURATION * 7; 286e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.zero: return KEY_FRAME_DURATION * 8; 287e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.one: return KEY_FRAME_DURATION * 9; 288e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.four: return KEY_FRAME_DURATION * 10; 289e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.seven: 290e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.star: 291e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn return KEY_FRAME_DURATION * 11; 292e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn } 293e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn } else { 294e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn switch (buttonId) { 295e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.one: return KEY_FRAME_DURATION * 1; 296e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.four: return KEY_FRAME_DURATION * 2; 297e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.seven: return KEY_FRAME_DURATION * 3; 298e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.star: return KEY_FRAME_DURATION * 4; 299e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.two: return KEY_FRAME_DURATION * 5; 300e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.five: return KEY_FRAME_DURATION * 6; 301e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.eight: return KEY_FRAME_DURATION * 7; 302e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.zero: return KEY_FRAME_DURATION * 8; 303e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.three: return KEY_FRAME_DURATION * 9; 304e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.six: return KEY_FRAME_DURATION * 10; 305e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.nine: 306e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.pound: 307e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn return KEY_FRAME_DURATION * 11; 308e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn } 309e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn } 310e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn } else { 311e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn switch (buttonId) { 312e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.one: return KEY_FRAME_DURATION * 1; 313e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.two: return KEY_FRAME_DURATION * 2; 314e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.three: return KEY_FRAME_DURATION * 3; 315e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.four: return KEY_FRAME_DURATION * 4; 316e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.five: return KEY_FRAME_DURATION * 5; 317e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.six: return KEY_FRAME_DURATION * 6; 318e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.seven: return KEY_FRAME_DURATION * 7; 319e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.eight: return KEY_FRAME_DURATION * 8; 320e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.nine: return KEY_FRAME_DURATION * 9; 321e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.star: return KEY_FRAME_DURATION * 10; 322e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.zero: 323e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.pound: 324e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn return KEY_FRAME_DURATION * 11; 325e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn } 32613b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati } 32713b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 32813b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati Log.wtf(TAG, "Attempted to get animation delay for invalid key button id."); 32913b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati return 0; 33013b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati } 33113b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 332e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn /** 333e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn * Get the button animation duration, taking into account whether the dialpad is in landscape 334e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn * left-to-right, landscape right-to-left, or portrait. 335e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn * 336e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn * @param buttonId The button ID. 337e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn * @return The animation duration. 338e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn */ 33913b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati private int getKeyButtonAnimationDuration(int buttonId) { 340e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn if (mIsLandscape) { 341e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn if (mIsRtl) { 342e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn switch (buttonId) { 343e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.one: 344e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.four: 345e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.seven: 346e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.star: 347e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn return KEY_FRAME_DURATION * 8; 348e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.two: 349e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.five: 350e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.eight: 351e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.zero: 352e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn return KEY_FRAME_DURATION * 9; 353e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.three: 354e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.six: 355e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.nine: 356e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.pound: 357e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn return KEY_FRAME_DURATION * 10; 358e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn } 359e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn } else { 360e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn switch (buttonId) { 361e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.one: 362e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.four: 363e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.seven: 364e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.star: 365e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn return KEY_FRAME_DURATION * 10; 366e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.two: 367e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.five: 368e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.eight: 369e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.zero: 370e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn return KEY_FRAME_DURATION * 9; 371e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.three: 372e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.six: 373e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.nine: 374e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.pound: 375e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn return KEY_FRAME_DURATION * 8; 376e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn } 377e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn } 378e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn } else { 379e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn switch (buttonId) { 380e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.one: 381e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.two: 382e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.three: 383e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.four: 384e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.five: 385e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.six: 386e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn return KEY_FRAME_DURATION * 10; 387e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.seven: 388e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.eight: 389e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.nine: 390e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn return KEY_FRAME_DURATION * 9; 391e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.star: 392e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.zero: 393e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn case R.id.pound: 394e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn return KEY_FRAME_DURATION * 8; 395e8efa9a75c79e9a34b7ad4148b4338e4db74665eTyler Gunn } 39613b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati } 39713b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati 39813b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati Log.wtf(TAG, "Attempted to get animation duration for invalid key button id."); 39913b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati return 0; 40013b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati } 40113b8948c0cc543f62a68fa32c4692ba16a2e93c6Sai Cheemalapati} 402