| /* |
| * Copyright (C) 2008 Esmertec AG. |
| * Copyright (C) 2008 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.mms.ui; |
| |
| import com.android.mms.R; |
| |
| import android.content.Context; |
| import android.graphics.Bitmap; |
| import android.graphics.BitmapFactory; |
| import android.media.MediaPlayer; |
| import android.net.Uri; |
| import android.text.method.HideReturnsTransformationMethod; |
| import android.util.AttributeSet; |
| import android.util.Config; |
| import android.util.Log; |
| import android.view.LayoutInflater; |
| import android.view.View; |
| import android.widget.AbsoluteLayout; |
| import android.widget.ImageView; |
| import android.widget.ScrollView; |
| import android.widget.TextView; |
| import android.widget.VideoView; |
| |
| import java.io.IOException; |
| import java.util.Map; |
| |
| /** |
| * A basic view to show the contents of a slide. |
| */ |
| public class SlideView extends AbsoluteLayout implements |
| AdaptableSlideViewInterface { |
| private static final String TAG = "SlideView"; |
| private static final boolean DEBUG = false; |
| private static final boolean LOCAL_LOGV = DEBUG ? Config.LOGD : Config.LOGV; |
| // FIXME: Need getHeight from mAudioInfoView instead of constant AUDIO_INFO_HEIGHT. |
| private static final int AUDIO_INFO_HEIGHT = 82; |
| |
| private View mAudioInfoView; |
| private ImageView mImageView; |
| private VideoView mVideoView; |
| private ScrollView mScrollText; |
| private TextView mTextView; |
| private OnSizeChangedListener mSizeChangedListener; |
| private MediaPlayer mAudioPlayer; |
| private boolean mIsPrepared; |
| private boolean mStartWhenPrepared; |
| private int mSeekWhenPrepared; |
| private boolean mStopWhenPrepared; |
| MediaPlayer.OnPreparedListener mPreparedListener = new MediaPlayer.OnPreparedListener() { |
| public void onPrepared(MediaPlayer mp) { |
| mIsPrepared = true; |
| if (mSeekWhenPrepared > 0) { |
| mAudioPlayer.seekTo(mSeekWhenPrepared); |
| mSeekWhenPrepared = 0; |
| } |
| if (mStartWhenPrepared) { |
| mAudioPlayer.start(); |
| mStartWhenPrepared = false; |
| displayAudioInfo(); |
| } |
| if (mStopWhenPrepared) { |
| mAudioPlayer.stop(); |
| mAudioPlayer.release(); |
| mAudioPlayer = null; |
| mStopWhenPrepared = false; |
| hideAudioInfo(); |
| } |
| } |
| }; |
| |
| public SlideView(Context context) { |
| super(context); |
| } |
| |
| public SlideView(Context context, AttributeSet attrs) { |
| super(context, attrs); |
| } |
| |
| public void setImage(String name, Bitmap bitmap) { |
| if (mImageView == null) { |
| mImageView = new ImageView(mContext); |
| addView(mImageView, new LayoutParams( |
| 0, 0, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); |
| if (DEBUG) { |
| mImageView.setBackgroundColor(0xFFFF0000); |
| } |
| } |
| |
| if (null == bitmap) { |
| bitmap = BitmapFactory.decodeResource(getResources(), |
| R.drawable.ic_missing_thumbnail_picture); |
| } |
| mImageView.setImageBitmap(bitmap); |
| } |
| |
| public void setImageRegion(int left, int top, int width, int height) { |
| if (mImageView != null) { |
| mImageView.setLayoutParams(new LayoutParams(width, height, left, top)); |
| } |
| } |
| |
| public void setImageRegionFit(String fit) { |
| // TODO Auto-generated method stub |
| } |
| |
| public void setVideo(String name, Uri video) { |
| if (mVideoView == null) { |
| mVideoView = new VideoView(mContext); |
| addView(mVideoView, new LayoutParams( |
| 0, 0, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); |
| if (DEBUG) { |
| mVideoView.setBackgroundColor(0xFFFF0000); |
| } |
| } |
| |
| if (LOCAL_LOGV) { |
| Log.v(TAG, "Changing video source to " + video); |
| } |
| mVideoView.setVideoURI(video); |
| } |
| |
| private void initAudioInfoView(String name) { |
| LayoutInflater factory = LayoutInflater.from(getContext()); |
| mAudioInfoView = factory.inflate(R.layout.playing_audio_info, null); |
| int height = mAudioInfoView.getHeight(); |
| TextView audioName = (TextView) mAudioInfoView.findViewById(R.id.name); |
| audioName.setText(name); |
| addView(mAudioInfoView, new LayoutParams( |
| LayoutParams.FILL_PARENT, AUDIO_INFO_HEIGHT, |
| 0, getHeight() - AUDIO_INFO_HEIGHT)); |
| if (DEBUG) { |
| mAudioInfoView.setBackgroundColor(0xFFFF0000); |
| } |
| |
| mAudioInfoView.setVisibility(View.GONE); |
| } |
| |
| private void displayAudioInfo() { |
| if (null != mAudioInfoView) { |
| mAudioInfoView.setVisibility(View.VISIBLE); |
| } |
| } |
| |
| private void hideAudioInfo() { |
| if (null != mAudioInfoView) { |
| mAudioInfoView.setVisibility(View.GONE); |
| } |
| } |
| |
| public void setAudio(Uri audio, String name, Map<String, ?> extras) { |
| if (audio == null) { |
| throw new IllegalArgumentException("Audio URI may not be null."); |
| } |
| |
| if (LOCAL_LOGV) { |
| Log.v(TAG, "Changing audio source to " + audio); |
| } |
| |
| if (mAudioPlayer != null) { |
| mAudioPlayer.reset(); |
| mAudioPlayer.release(); |
| mAudioPlayer = null; |
| } |
| mIsPrepared = false; |
| |
| try { |
| mAudioPlayer = new MediaPlayer(); |
| mAudioPlayer.setOnPreparedListener(mPreparedListener); |
| mAudioPlayer.setDataSource(mContext, audio); |
| mAudioPlayer.prepareAsync(); |
| } catch (IOException e) { |
| Log.e(TAG, "Unexpected IOException.", e); |
| mAudioPlayer.release(); |
| mAudioPlayer = null; |
| } |
| initAudioInfoView(name); |
| } |
| |
| public void setText(String name, String text) { |
| if (null == mScrollText) { |
| mScrollText = new ScrollView(mContext); |
| mScrollText.setScrollBarStyle(SCROLLBARS_OUTSIDE_INSET); |
| addView(mScrollText, new LayoutParams( |
| 0, 0, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); |
| if (DEBUG) { |
| mScrollText.setBackgroundColor(0xFF00FF00); |
| } |
| } |
| |
| if (null == mTextView) { |
| mTextView = new TextView(mContext); |
| mTextView.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); |
| mScrollText.addView(mTextView); |
| } |
| |
| mScrollText.requestFocus(); |
| mTextView.setText(text); |
| } |
| |
| public void setTextRegion(int left, int top, int width, int height) { |
| if (mScrollText != null) { |
| mScrollText.setLayoutParams(new LayoutParams(width, height, left, top)); |
| } |
| } |
| |
| public void setVideoRegion(int left, int top, int width, int height) { |
| if (mVideoView != null) { |
| mVideoView.setLayoutParams(new LayoutParams(width, height, left, top)); |
| } |
| } |
| |
| public void setImageVisibility(boolean visible) { |
| if (mImageView != null) { |
| mImageView.setVisibility(visible ? View.VISIBLE : View.INVISIBLE); |
| } |
| } |
| |
| public void setTextVisibility(boolean visible) { |
| if (mScrollText != null) { |
| mScrollText.setVisibility(visible ? View.VISIBLE : View.INVISIBLE); |
| } |
| } |
| |
| public void setVideoVisibility(boolean visible) { |
| if (mVideoView != null) { |
| mVideoView.setVisibility(visible ? View.VISIBLE : View.INVISIBLE); |
| } |
| } |
| |
| public void startAudio() { |
| if ((mAudioPlayer != null) && mIsPrepared) { |
| mAudioPlayer.start(); |
| mStartWhenPrepared = false; |
| displayAudioInfo(); |
| } else { |
| mStartWhenPrepared = true; |
| } |
| } |
| |
| public void stopAudio() { |
| if ((mAudioPlayer != null) && mIsPrepared) { |
| mAudioPlayer.stop(); |
| mAudioPlayer.release(); |
| mAudioPlayer = null; |
| hideAudioInfo(); |
| } else { |
| mStopWhenPrepared = true; |
| } |
| } |
| |
| public void pauseAudio() { |
| if ((mAudioPlayer != null) && mIsPrepared) { |
| if (mAudioPlayer.isPlaying()) { |
| mAudioPlayer.pause(); |
| } |
| } |
| mStartWhenPrepared = false; |
| } |
| |
| public void seekAudio(int seekTo) { |
| if ((mAudioPlayer != null) && mIsPrepared) { |
| mAudioPlayer.seekTo(seekTo); |
| } else { |
| mSeekWhenPrepared = seekTo; |
| } |
| } |
| |
| public void startVideo() { |
| if (mVideoView != null) { |
| if (LOCAL_LOGV) { |
| Log.v(TAG, "Starting video playback."); |
| } |
| mVideoView.start(); |
| } |
| } |
| |
| public void stopVideo() { |
| if ((mVideoView != null)) { |
| if (LOCAL_LOGV) { |
| Log.v(TAG, "Stopping video playback."); |
| } |
| mVideoView.stopPlayback(); |
| } |
| } |
| |
| public void pauseVideo() { |
| if (mVideoView != null) { |
| if (LOCAL_LOGV) { |
| Log.v(TAG, "Pausing video playback."); |
| } |
| mVideoView.pause(); |
| } |
| } |
| |
| public void seekVideo(int seekTo) { |
| if (mVideoView != null) { |
| if (seekTo > 0) { |
| if (LOCAL_LOGV) { |
| Log.v(TAG, "Seeking video playback to " + seekTo); |
| } |
| mVideoView.seekTo(seekTo); |
| } |
| } |
| } |
| |
| public void reset() { |
| if (null != mScrollText) { |
| mScrollText.setVisibility(View.GONE); |
| } |
| |
| if (null != mImageView) { |
| mImageView.setVisibility(View.GONE); |
| } |
| |
| if (null != mAudioPlayer) { |
| stopAudio(); |
| } |
| |
| if (null != mVideoView) { |
| stopVideo(); |
| mVideoView.setVisibility(View.GONE); |
| } |
| } |
| |
| public void setVisibility(boolean visible) { |
| // TODO Auto-generated method stub |
| } |
| |
| @Override |
| protected void onSizeChanged(int w, int h, int oldw, int oldh) { |
| super.onSizeChanged(w, h, oldw, oldh); |
| |
| if (mSizeChangedListener != null) { |
| if (LOCAL_LOGV) { |
| Log.v(TAG, "new size=" + w + "x" + h); |
| } |
| mSizeChangedListener.onSizeChanged(w, h - AUDIO_INFO_HEIGHT); |
| } |
| } |
| |
| public void setOnSizeChangedListener(OnSizeChangedListener l) { |
| mSizeChangedListener = l; |
| } |
| } |