summaryrefslogtreecommitdiffstats
path: root/src/com/android/messaging/ui/AudioAttachmentView.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/messaging/ui/AudioAttachmentView.java')
-rw-r--r--src/com/android/messaging/ui/AudioAttachmentView.java329
1 files changed, 0 insertions, 329 deletions
diff --git a/src/com/android/messaging/ui/AudioAttachmentView.java b/src/com/android/messaging/ui/AudioAttachmentView.java
deleted file mode 100644
index bb649b0..0000000
--- a/src/com/android/messaging/ui/AudioAttachmentView.java
+++ /dev/null
@@ -1,329 +0,0 @@
-/*
- * 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.messaging.ui;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.Canvas;
-import android.graphics.Path;
-import android.graphics.RectF;
-import android.media.AudioManager;
-import android.media.MediaPlayer;
-import android.media.MediaPlayer.OnCompletionListener;
-import android.media.MediaPlayer.OnErrorListener;
-import android.media.MediaPlayer.OnPreparedListener;
-import android.net.Uri;
-import android.os.SystemClock;
-import android.text.TextUtils;
-import android.util.AttributeSet;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-
-import com.android.messaging.Factory;
-import com.android.messaging.R;
-import com.android.messaging.datamodel.data.MessagePartData;
-import com.android.messaging.ui.mediapicker.PausableChronometer;
-import com.android.messaging.util.Assert;
-import com.android.messaging.util.ContentType;
-import com.android.messaging.util.LogUtil;
-import com.android.messaging.util.UiUtils;
-
-/**
- * A reusable widget that hosts an audio player for audio attachment playback. This widget is used
- * by both the media picker and the conversation message view to show audio attachments.
- */
-public class AudioAttachmentView extends LinearLayout {
- /** The normal layout mode where we have the play button, timer and progress bar */
- private static final int LAYOUT_MODE_NORMAL = 0;
-
- /** The compact layout mode with only the play button and the timer beneath it. Suitable
- * for displaying in limited space such as multi-attachment layout */
- private static final int LAYOUT_MODE_COMPACT = 1;
-
- /** The sub-compact layout mode with only the play button. */
- private static final int LAYOUT_MODE_SUB_COMPACT = 2;
-
- private static final int PLAY_BUTTON = 0;
- private static final int PAUSE_BUTTON = 1;
-
- private AudioAttachmentPlayPauseButton mPlayPauseButton;
- private PausableChronometer mChronometer;
- private AudioPlaybackProgressBar mProgressBar;
- private MediaPlayer mMediaPlayer;
-
- private Uri mDataSourceUri;
-
- // The corner radius for drawing rounded corners. The default value is zero (no rounded corners)
- private final int mCornerRadius;
- private final Path mRoundedCornerClipPath;
- private int mClipPathWidth;
- private int mClipPathHeight;
-
- // Indicates whether the attachment view is to be styled as a part of an incoming message.
- private boolean mShowAsIncoming;
-
- private boolean mPrepared;
- private boolean mPlaybackFinished;
- private final int mMode;
-
- public AudioAttachmentView(final Context context, final AttributeSet attrs) {
- super(context, attrs);
- final TypedArray typedAttributes =
- context.obtainStyledAttributes(attrs, R.styleable.AudioAttachmentView);
- mMode = typedAttributes.getInt(R.styleable.AudioAttachmentView_layoutMode,
- LAYOUT_MODE_NORMAL);
- final LayoutInflater inflater = LayoutInflater.from(getContext());
- inflater.inflate(R.layout.audio_attachment_view, this, true);
- typedAttributes.recycle();
-
- setWillNotDraw(mMode != LAYOUT_MODE_SUB_COMPACT);
- mRoundedCornerClipPath = new Path();
- mCornerRadius = context.getResources().getDimensionPixelSize(
- R.dimen.conversation_list_image_preview_corner_radius);
- setContentDescription(context.getString(R.string.audio_attachment_content_description));
- }
-
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
-
- mPlayPauseButton = (AudioAttachmentPlayPauseButton) findViewById(R.id.play_pause_button);
- mChronometer = (PausableChronometer) findViewById(R.id.timer);
- mProgressBar = (AudioPlaybackProgressBar) findViewById(R.id.progress);
- mPlayPauseButton.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(final View v) {
- setupMediaPlayer();
- if (mMediaPlayer != null && mPrepared) {
- if (mMediaPlayer.isPlaying()) {
- mMediaPlayer.pause();
- mChronometer.pause();
- mProgressBar.pause();
- } else {
- playAudio();
- }
- }
- updatePlayPauseButtonState();
- }
- });
- updatePlayPauseButtonState();
- initializeViewsForMode();
- }
-
- /**
- * Bind the audio attachment view with a MessagePartData.
- * @param incoming indicates whether the attachment view is to be styled as a part of an
- * incoming message.
- */
- public void bindMessagePartData(final MessagePartData messagePartData,
- final boolean incoming) {
- Assert.isTrue(messagePartData == null ||
- ContentType.isAudioType(messagePartData.getContentType()));
- final Uri contentUri = (messagePartData == null) ? null : messagePartData.getContentUri();
- bind(contentUri, incoming);
- }
-
- public void bind(final Uri dataSourceUri, final boolean incoming) {
- final String currentUriString = (mDataSourceUri == null) ? "" : mDataSourceUri.toString();
- final String newUriString = (dataSourceUri == null) ? "" : dataSourceUri.toString();
- mShowAsIncoming = incoming;
- if (!TextUtils.equals(currentUriString, newUriString)) {
- mDataSourceUri = dataSourceUri;
- resetToZeroState();
- }
- }
-
- private void playAudio() {
- Assert.notNull(mMediaPlayer);
- if (mPlaybackFinished) {
- mMediaPlayer.seekTo(0);
- mChronometer.restart();
- mProgressBar.restart();
- mPlaybackFinished = false;
- } else {
- mChronometer.resume();
- mProgressBar.resume();
- }
- mMediaPlayer.start();
- }
-
- private void onAudioReplayError(final int what, final int extra, final Exception exception) {
- if (exception == null) {
- LogUtil.e(LogUtil.BUGLE_TAG, "audio replay failed, what=" + what +
- ", extra=" + extra);
- } else {
- LogUtil.e(LogUtil.BUGLE_TAG, "audio replay failed, exception=" + exception);
- }
- UiUtils.showToastAtBottom(R.string.audio_recording_replay_failed);
- releaseMediaPlayer();
- }
-
- private void setupMediaPlayer() {
- Assert.notNull(mDataSourceUri);
- if (mMediaPlayer == null) {
- Assert.isTrue(!mPrepared);
- mMediaPlayer = new MediaPlayer();
- try {
- mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
- mMediaPlayer.setDataSource(Factory.get().getApplicationContext(), mDataSourceUri);
- mMediaPlayer.setOnCompletionListener(new OnCompletionListener() {
- @Override
- public void onCompletion(final MediaPlayer mp) {
- updatePlayPauseButtonState();
- mChronometer.reset();
- mChronometer.setBase(SystemClock.elapsedRealtime() -
- mMediaPlayer.getDuration());
- mProgressBar.reset();
-
- mPlaybackFinished = true;
- }
- });
-
- mMediaPlayer.setOnPreparedListener(new OnPreparedListener() {
- @Override
- public void onPrepared(final MediaPlayer mp) {
- // Set base on the chronometer so we can show the full length of the audio.
- mChronometer.setBase(SystemClock.elapsedRealtime() -
- mMediaPlayer.getDuration());
- mProgressBar.setDuration(mMediaPlayer.getDuration());
- mMediaPlayer.seekTo(0);
- mPrepared = true;
- }
- });
-
- mMediaPlayer.setOnErrorListener(new OnErrorListener() {
- @Override
- public boolean onError(final MediaPlayer mp, final int what, final int extra) {
- onAudioReplayError(what, extra, null);
- return true;
- }
- });
- mMediaPlayer.prepareAsync();
- } catch (final Exception exception) {
- onAudioReplayError(0, 0, exception);
- releaseMediaPlayer();
- }
- }
- }
-
- private void releaseMediaPlayer() {
- if (mMediaPlayer != null) {
- mMediaPlayer.release();
- mMediaPlayer = null;
- mPrepared = false;
- mPlaybackFinished = false;
- }
- }
-
- @Override
- protected void onDetachedFromWindow() {
- super.onDetachedFromWindow();
- releaseMediaPlayer();
- }
-
- @Override
- protected void onDraw(final Canvas canvas) {
- if (mMode != LAYOUT_MODE_SUB_COMPACT) {
- return;
- }
-
- final int currentWidth = this.getWidth();
- final int currentHeight = this.getHeight();
- if (mClipPathWidth != currentWidth || mClipPathHeight != currentHeight) {
- final RectF rect = new RectF(0, 0, currentWidth, currentHeight);
- mRoundedCornerClipPath.reset();
- mRoundedCornerClipPath.addRoundRect(rect, mCornerRadius, mCornerRadius,
- Path.Direction.CW);
- mClipPathWidth = currentWidth;
- mClipPathHeight = currentHeight;
- }
-
- canvas.clipPath(mRoundedCornerClipPath);
- super.onDraw(canvas);
- }
-
- private void updatePlayPauseButtonState() {
- if (mMediaPlayer == null || !mMediaPlayer.isPlaying()) {
- mPlayPauseButton.setDisplayedChild(PLAY_BUTTON);
- } else {
- mPlayPauseButton.setDisplayedChild(PAUSE_BUTTON);
- }
- }
-
- private void resetToZeroState() {
- // Release the media player so it may be set up with the new audio source.
- releaseMediaPlayer();
- mChronometer.reset();
- mProgressBar.reset();
- updateVisualStyle();
-
- if (mDataSourceUri != null) {
- // Re-ensure the media player, so we can read the duration of the audio.
- setupMediaPlayer();
- }
- }
-
- private void updateVisualStyle() {
- if (mMode == LAYOUT_MODE_SUB_COMPACT) {
- // Sub-compact mode has static visual appearance already set up during initialization.
- return;
- }
-
- if (mShowAsIncoming) {
- mChronometer.setTextColor(getResources().getColor(R.color.message_text_color_incoming));
- } else {
- mChronometer.setTextColor(getResources().getColor(R.color.message_text_color_outgoing));
- }
- mProgressBar.setVisualStyle(mShowAsIncoming);
- mPlayPauseButton.setVisualStyle(mShowAsIncoming);
- updatePlayPauseButtonState();
- }
-
- private void initializeViewsForMode() {
- switch (mMode) {
- case LAYOUT_MODE_NORMAL:
- setOrientation(HORIZONTAL);
- mProgressBar.setVisibility(VISIBLE);
- break;
-
- case LAYOUT_MODE_COMPACT:
- setOrientation(VERTICAL);
- mProgressBar.setVisibility(GONE);
- ((MarginLayoutParams) mPlayPauseButton.getLayoutParams()).setMargins(0, 0, 0, 0);
- ((MarginLayoutParams) mChronometer.getLayoutParams()).setMargins(0, 0, 0, 0);
- break;
-
- case LAYOUT_MODE_SUB_COMPACT:
- setOrientation(VERTICAL);
- mProgressBar.setVisibility(GONE);
- mChronometer.setVisibility(GONE);
- ((MarginLayoutParams) mPlayPauseButton.getLayoutParams()).setMargins(0, 0, 0, 0);
- final ImageView playButton = (ImageView) findViewById(R.id.play_button);
- playButton.setImageDrawable(
- getResources().getDrawable(R.drawable.ic_preview_play));
- final ImageView pauseButton = (ImageView) findViewById(R.id.pause_button);
- pauseButton.setImageDrawable(
- getResources().getDrawable(R.drawable.ic_preview_pause));
- break;
-
- default:
- Assert.fail("Unsupported mode for AudioAttachmentView!");
- break;
- }
- }
-}