| /* |
| * Copyright (C) 2015 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.dialer.dialpadview; |
| |
| import android.animation.Animator; |
| import android.animation.Animator.AnimatorListener; |
| import android.animation.ArgbEvaluator; |
| import android.animation.ValueAnimator; |
| import android.content.Context; |
| import android.graphics.Color; |
| import android.graphics.ColorFilter; |
| import android.graphics.LightingColorFilter; |
| import android.os.Handler; |
| import android.os.Vibrator; |
| import android.view.View; |
| |
| /** Animates the dial button on "emergency" phone numbers. */ |
| public class PseudoEmergencyAnimator { |
| |
| static final String PSEUDO_EMERGENCY_NUMBER = "01189998819991197253"; |
| private static final int VIBRATE_LENGTH_MILLIS = 200; |
| private static final int ITERATION_LENGTH_MILLIS = 1000; |
| private static final int ANIMATION_ITERATION_COUNT = 6; |
| private ViewProvider viewProvider; |
| private ValueAnimator pseudoEmergencyColorAnimator; |
| |
| PseudoEmergencyAnimator(ViewProvider viewProvider) { |
| this.viewProvider = viewProvider; |
| } |
| |
| public void destroy() { |
| end(); |
| viewProvider = null; |
| } |
| |
| public void start() { |
| if (pseudoEmergencyColorAnimator == null) { |
| Integer colorFrom = Color.BLUE; |
| Integer colorTo = Color.RED; |
| pseudoEmergencyColorAnimator = |
| ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo); |
| |
| pseudoEmergencyColorAnimator.addUpdateListener( |
| animator -> { |
| try { |
| int color = (int) animator.getAnimatedValue(); |
| ColorFilter colorFilter = new LightingColorFilter(Color.BLACK, color); |
| |
| if (viewProvider.getFab() != null) { |
| viewProvider.getFab().getBackground().setColorFilter(colorFilter); |
| } |
| } catch (Exception e) { |
| animator.cancel(); |
| } |
| }); |
| |
| pseudoEmergencyColorAnimator.addListener( |
| new AnimatorListener() { |
| @Override |
| public void onAnimationCancel(Animator animation) {} |
| |
| @Override |
| public void onAnimationRepeat(Animator animation) { |
| try { |
| vibrate(VIBRATE_LENGTH_MILLIS); |
| } catch (Exception e) { |
| animation.cancel(); |
| } |
| } |
| |
| @Override |
| public void onAnimationStart(Animator animation) {} |
| |
| @Override |
| public void onAnimationEnd(Animator animation) { |
| try { |
| if (viewProvider.getFab() != null) { |
| viewProvider.getFab().getBackground().clearColorFilter(); |
| } |
| |
| new Handler() |
| .postDelayed( |
| () -> { |
| try { |
| vibrate(VIBRATE_LENGTH_MILLIS); |
| } catch (Exception e) { |
| // ignored |
| } |
| }, |
| ITERATION_LENGTH_MILLIS); |
| } catch (Exception e) { |
| animation.cancel(); |
| } |
| } |
| }); |
| |
| pseudoEmergencyColorAnimator.setDuration(VIBRATE_LENGTH_MILLIS); |
| pseudoEmergencyColorAnimator.setRepeatMode(ValueAnimator.REVERSE); |
| pseudoEmergencyColorAnimator.setRepeatCount(ANIMATION_ITERATION_COUNT); |
| } |
| if (!pseudoEmergencyColorAnimator.isStarted()) { |
| pseudoEmergencyColorAnimator.start(); |
| } |
| } |
| |
| public void end() { |
| if (pseudoEmergencyColorAnimator != null && pseudoEmergencyColorAnimator.isStarted()) { |
| pseudoEmergencyColorAnimator.end(); |
| } |
| } |
| |
| private void vibrate(long milliseconds) { |
| Context context = viewProvider.getContext(); |
| if (context != null) { |
| Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); |
| if (vibrator != null) { |
| vibrator.vibrate(milliseconds); |
| } |
| } |
| } |
| |
| interface ViewProvider { |
| |
| View getFab(); |
| |
| Context getContext(); |
| } |
| } |