blob: ac64cde3487ecbf3b8e0dccf255a64fd0c3a84b8 [file] [log] [blame]
/*
* 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);
}
}