| /* |
| * Copyright (C) 2018 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.voicemail.settings; |
| |
| import android.content.Context; |
| import android.graphics.Canvas; |
| import android.graphics.Color; |
| import android.graphics.Paint; |
| import android.graphics.Rect; |
| import android.graphics.RectF; |
| import android.graphics.drawable.Drawable; |
| import android.graphics.drawable.LayerDrawable; |
| import android.support.v4.content.ContextCompat; |
| import android.util.AttributeSet; |
| import android.widget.Button; |
| import com.android.dialer.voicemail.settings.RecordVoicemailGreetingActivity.ButtonState; |
| |
| /** Custom Button View for Dialer voicemail greeting recording */ |
| public class RecordButton extends Button { |
| |
| private final float trackWidth = getResources().getDimensionPixelSize(R.dimen.track_width); |
| private final int centerIconRadius = |
| getResources().getDimensionPixelSize(R.dimen.center_icon_radius); |
| private final int secondaryTrackAlpha = 64; |
| |
| private float mainTrackFraction; |
| private float secondaryTrackFraction; |
| |
| private Rect centerIconRect; |
| private RectF bodyRect; |
| |
| private Drawable readyDrawable; |
| private Drawable recordingDrawable; |
| private Drawable recordedDrawable; |
| private Drawable playingDrawable; |
| private Drawable currentCenterDrawable; |
| |
| private Paint mainTrackPaint; |
| private Paint secondaryTrackPaint; |
| |
| public RecordButton(Context context) { |
| super(context); |
| init(); |
| } |
| |
| public RecordButton(Context context, AttributeSet attrs) { |
| super(context, attrs); |
| init(); |
| } |
| |
| public RecordButton(Context context, AttributeSet attrs, int defStyle) { |
| super(context, attrs, defStyle); |
| init(); |
| } |
| |
| /** |
| * Updates bounds for main and secondary tracks and the size of the center Drawable based on View |
| * resizing |
| */ |
| @Override |
| protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) { |
| // Canvas.drawArc() method draws from center of stroke, so the trackWidth must be accounted for |
| float viewRadius = Math.min(width, height) / 2f - trackWidth; |
| float centerX = width / 2f; |
| float centerY = viewRadius + trackWidth / 2f; |
| |
| bodyRect = |
| new RectF( |
| centerX - viewRadius, centerY - viewRadius, centerX + viewRadius, centerY + viewRadius); |
| |
| centerIconRect = |
| new Rect( |
| (int) centerX - centerIconRadius, |
| (int) centerY - centerIconRadius, |
| (int) centerX + centerIconRadius, |
| (int) centerY + centerIconRadius); |
| } |
| |
| private void init() { |
| readyDrawable = ContextCompat.getDrawable(getContext(), R.drawable.start_recording_drawable); |
| recordingDrawable = ContextCompat.getDrawable(getContext(), R.drawable.stop_recording_drawable); |
| recordedDrawable = ContextCompat.getDrawable(getContext(), R.drawable.start_playback_drawable); |
| playingDrawable = ContextCompat.getDrawable(getContext(), R.drawable.stop_playback_drawable); |
| |
| fixQuantumIconTint(Color.WHITE); |
| |
| mainTrackPaint = getBasePaint(R.color.dialer_call_green); |
| secondaryTrackPaint = getBasePaint(R.color.dialer_call_green); |
| secondaryTrackPaint.setAlpha(secondaryTrackAlpha); |
| |
| setState(RecordVoicemailGreetingActivity.RECORD_GREETING_INIT); |
| } |
| |
| private void fixQuantumIconTint(int color) { |
| Drawable playArrow = ((LayerDrawable) recordedDrawable).findDrawableByLayerId(R.id.play_icon); |
| playArrow.mutate().setTint(color); |
| ((LayerDrawable) recordedDrawable).setDrawableByLayerId(R.id.play_icon, playArrow); |
| |
| Drawable micIcon = ((LayerDrawable) readyDrawable).findDrawableByLayerId(R.id.record_icon); |
| micIcon.mutate().setTint(color); |
| ((LayerDrawable) readyDrawable).setDrawableByLayerId(R.id.record_icon, micIcon); |
| } |
| |
| /** Returns Paint with base attributes for drawing the main and secondary tracks */ |
| private Paint getBasePaint(int id) { |
| Paint paint = new Paint(); |
| paint.setAntiAlias(true); |
| paint.setStrokeWidth(trackWidth); |
| paint.setStrokeCap(Paint.Cap.ROUND); |
| paint.setStyle(Paint.Style.STROKE); |
| paint.setColor(ContextCompat.getColor(getContext(), id)); |
| return paint; |
| } |
| |
| /** Sets the fraction value of progress tracks, this will trigger a redraw of the button. */ |
| public void setTracks(float mainTrackFraction, float secondaryTrackFraction) { |
| this.mainTrackFraction = mainTrackFraction; |
| this.secondaryTrackFraction = secondaryTrackFraction; |
| invalidate(); |
| } |
| |
| /** |
| * Sets internal state of RecordButton. This will also trigger UI refresh of the button to reflect |
| * the new state. |
| */ |
| public void setState(@ButtonState int state) { |
| switch (state) { |
| case RecordVoicemailGreetingActivity.RECORD_GREETING_INIT: |
| mainTrackPaint = getBasePaint(R.color.dialer_call_green); |
| secondaryTrackPaint = getBasePaint(R.color.dialer_call_green); |
| secondaryTrackPaint.setAlpha(secondaryTrackAlpha); |
| currentCenterDrawable = readyDrawable; |
| break; |
| case RecordVoicemailGreetingActivity.RECORD_GREETING_PLAYING_BACK: |
| mainTrackPaint = getBasePaint(R.color.google_blue_500); |
| secondaryTrackPaint = getBasePaint(R.color.google_blue_50); |
| currentCenterDrawable = playingDrawable; |
| break; |
| case RecordVoicemailGreetingActivity.RECORD_GREETING_RECORDED: |
| mainTrackPaint = getBasePaint(R.color.google_blue_500); |
| secondaryTrackPaint = getBasePaint(R.color.google_blue_50); |
| currentCenterDrawable = recordedDrawable; |
| break; |
| case RecordVoicemailGreetingActivity.RECORD_GREETING_RECORDING: |
| mainTrackPaint = getBasePaint(R.color.dialer_red); |
| secondaryTrackPaint = getBasePaint(R.color.dialer_red); |
| secondaryTrackPaint.setAlpha(secondaryTrackAlpha); |
| currentCenterDrawable = recordingDrawable; |
| break; |
| default: |
| throw new RuntimeException("Invalid button state"); |
| } |
| refreshDrawableState(); |
| invalidate(); |
| } |
| |
| /** |
| * Handles drawing the main and secondary track arcs and the center Drawable image based on track |
| * fractions and the Button's current state |
| */ |
| @Override |
| protected void onDraw(Canvas canvas) { |
| super.onDraw(canvas); |
| |
| canvas.drawArc(bodyRect, -90, secondaryTrackFraction * 360, false, secondaryTrackPaint); |
| canvas.drawArc(bodyRect, -90, mainTrackFraction * 360, false, mainTrackPaint); |
| |
| // TODO(marquelle) - Add pulse |
| |
| currentCenterDrawable.setBounds(centerIconRect); |
| currentCenterDrawable.draw(canvas); |
| } |
| } |