diff options
Diffstat (limited to 'java')
7 files changed, 349 insertions, 3 deletions
diff --git a/java/com/android/dialer/voicemail/settings/RecordButton.java b/java/com/android/dialer/voicemail/settings/RecordButton.java index f144576d4..d62637053 100644 --- a/java/com/android/dialer/voicemail/settings/RecordButton.java +++ b/java/com/android/dialer/voicemail/settings/RecordButton.java @@ -17,21 +17,157 @@ package com.android.dialer.voicemail.settings; import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.RectF; +import android.graphics.drawable.Drawable; +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); + + mainTrackPaint = getBasePaint(R.color.dialer_call_green); + secondaryTrackPaint = getBasePaint(R.color.dialer_call_green); + secondaryTrackPaint.setAlpha(secondaryTrackAlpha); + + setState(RecordVoicemailGreetingActivity.RECORD_GREETING_INIT); + } + + /** 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(); } - public RecordButton(Context context, AttributeSet attrs, int defStyleAttrs) { - super(context, attrs, defStyleAttrs); + /** + * 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); } } diff --git a/java/com/android/dialer/voicemail/settings/RecordVoicemailGreetingActivity.java b/java/com/android/dialer/voicemail/settings/RecordVoicemailGreetingActivity.java index 750636faa..17f8282c5 100644 --- a/java/com/android/dialer/voicemail/settings/RecordVoicemailGreetingActivity.java +++ b/java/com/android/dialer/voicemail/settings/RecordVoicemailGreetingActivity.java @@ -18,13 +18,83 @@ package com.android.dialer.voicemail.settings; import android.app.Activity; import android.os.Bundle; +import android.support.annotation.IntDef; +import android.view.View; +import android.view.View.OnClickListener; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; /** Activity for recording a new voicemail greeting */ -public class RecordVoicemailGreetingActivity extends Activity { +public class RecordVoicemailGreetingActivity extends Activity implements OnClickListener { + + /** Possible states of RecordButton and RecordVoicemailGreetingActivity */ + @Retention(RetentionPolicy.SOURCE) + @IntDef({ + RECORD_GREETING_INIT, + RECORD_GREETING_RECORDED, + RECORD_GREETING_RECORDED, + RECORD_GREETING_PLAYING_BACK + }) + public @interface ButtonState {} + + public static final int RECORD_GREETING_INIT = 1; + public static final int RECORD_GREETING_RECORDING = 2; + public static final int RECORD_GREETING_RECORDED = 3; + public static final int RECORD_GREETING_PLAYING_BACK = 4; + public static final int MAX_GREETING_DURATION_MS = 45000; + + private int currentState; + private int duration; + private RecordButton recordButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_record_voicemail_greeting); + + duration = 0; + setState(RECORD_GREETING_INIT); + } + + @Override + public void onClick(View v) { + if (v == recordButton) { + switch (currentState) { + case RECORD_GREETING_INIT: + setState(RECORD_GREETING_RECORDING); + break; + case RECORD_GREETING_RECORDED: + setState(RECORD_GREETING_PLAYING_BACK); + break; + case RECORD_GREETING_RECORDING: + case RECORD_GREETING_PLAYING_BACK: + setState(RECORD_GREETING_RECORDED); + break; + default: + break; + } + } + } + + private void setState(@ButtonState int state) { + currentState = state; + + switch (state) { + case RECORD_GREETING_INIT: + recordButton.setState(state); + recordButton.setTracks(0, 0); + break; + case RECORD_GREETING_PLAYING_BACK: + case RECORD_GREETING_RECORDED: + recordButton.setState(state); + recordButton.setTracks(0, (float) duration / MAX_GREETING_DURATION_MS); + break; + case RECORD_GREETING_RECORDING: + recordButton.setState(state); + recordButton.setTracks(0, 1f); + break; + default: + break; + } } } diff --git a/java/com/android/dialer/voicemail/settings/res/drawable/start_playback_drawable.xml b/java/com/android/dialer/voicemail/settings/res/drawable/start_playback_drawable.xml new file mode 100644 index 000000000..2a7ec4a7c --- /dev/null +++ b/java/com/android/dialer/voicemail/settings/res/drawable/start_playback_drawable.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- 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. +--> + +<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> + <item> + <shape android:shape="oval"> + <solid android:color="@color/google_blue_500"/> + </shape> + </item> + <item + android:top="24dp" + android:bottom="24dp" + android:left="24dp" + android:right="24dp" + android:drawable="@drawable/quantum_ic_play_arrow_vd_theme_24"/> +</layer-list> diff --git a/java/com/android/dialer/voicemail/settings/res/drawable/start_recording_drawable.xml b/java/com/android/dialer/voicemail/settings/res/drawable/start_recording_drawable.xml new file mode 100644 index 000000000..42d27fc2a --- /dev/null +++ b/java/com/android/dialer/voicemail/settings/res/drawable/start_recording_drawable.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- 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. +--> + +<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> + <item> + <shape android:shape="oval"> + <solid android:color="@color/dialer_call_green"/> + </shape> + </item> + <item + android:top="24dp" + android:bottom="24dp" + android:left="24dp" + android:right="24dp" + android:drawable="@drawable/quantum_ic_mic_vd_theme_24"/> +</layer-list> diff --git a/java/com/android/dialer/voicemail/settings/res/drawable/stop_playback_drawable.xml b/java/com/android/dialer/voicemail/settings/res/drawable/stop_playback_drawable.xml new file mode 100644 index 000000000..24bf90b40 --- /dev/null +++ b/java/com/android/dialer/voicemail/settings/res/drawable/stop_playback_drawable.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- 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. +--> + +<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> + <item> + <shape android:shape="oval"> + <solid android:color="@color/google_blue_500"/> + </shape> + </item> + <item + android:width="24dp" + android:height="24dp" + android:gravity="center"> + <shape android:shape="rectangle"> + <solid android:color="@android:color/white"/> + </shape> + </item> +</layer-list> diff --git a/java/com/android/dialer/voicemail/settings/res/drawable/stop_recording_drawable.xml b/java/com/android/dialer/voicemail/settings/res/drawable/stop_recording_drawable.xml new file mode 100644 index 000000000..cff539d54 --- /dev/null +++ b/java/com/android/dialer/voicemail/settings/res/drawable/stop_recording_drawable.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- 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. +--> + +<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> + <item> + <shape android:shape="oval"> + <solid android:color="@color/dialer_red"/> + </shape> + </item> + <item + android:width="24dp" + android:height="24dp" + android:gravity="center"> + <shape android:shape="rectangle"> + <solid android:color="@android:color/white"/> + </shape> + </item> +</layer-list> diff --git a/java/com/android/dialer/voicemail/settings/res/values/dimens_record_button.xml b/java/com/android/dialer/voicemail/settings/res/values/dimens_record_button.xml new file mode 100644 index 000000000..a45f987c2 --- /dev/null +++ b/java/com/android/dialer/voicemail/settings/res/values/dimens_record_button.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- 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. +--> + +<resources> + <dimen name="track_width">15dp</dimen> + <dimen name="center_icon_radius">48dp</dimen> +</resources> |